সেরা অভ্যাসগুলি: পিএইচপি-তে দীর্ঘ, বহু লাইনযুক্ত স্ট্রিংগুলির সাথে কাজ করছেন?


177

দ্রষ্টব্য: আমি দুঃখিত যদি এটি একটি অত্যন্ত সাধারণ প্রশ্ন তবে আমি আমার কোডটির বিন্যাসের জন্য কিছুটা আবেগী বাধ্য ive

আমার একটি ক্লাস রয়েছে যার একটি ফাংশন রয়েছে যা একটি স্ট্রিং প্রদান করে যা কোনও ইমেলের বডি টেক্সট তৈরি করে। আমি এই পাঠ্যটি ফর্ম্যাট করতে চাই যাতে এটি ইমেলটিতে ঠিক দেখাচ্ছে তবে এটি আমার কোডটিকে মজাদার দেখাচ্ছে না। আমি যা বলতে চাইছি তা এখানে:

class Something
{
    public function getEmailText($vars)
    {
        $text = 'Hello ' . $vars->name . ",

The second line starts two lines below.

I also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
        return $text;
    }
}

তবে এটি হিসাবে লেখা যেতে পারে:

public function getEmailText($vars)
{
    $text = "Hello {$vars->name},\n\rThe second line starts two lines below.\n\rI also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
    return $text;
}

তবে নতুন লাইন এবং গাড়ীর রিটার্নের সাথে কী চুক্তি হয়েছে? পার্থক্য কি? কি \n\nসমতুল্য \r\rবা \n\r? আমি যখন লাইনের মধ্যে একটি লাইন ফাঁক তৈরি করি তখন আমার কোনটি ব্যবহার করা উচিত?

তারপরে আউটপুট বাফারিং এবং হেরডোক সিনট্যাক্সের বিকল্প রয়েছে।

আপনি কীভাবে আপনার অবজেক্টগুলিতে দীর্ঘ মাল্টলাইন স্ট্রিং ব্যবহার করছেন তা মোকাবেলা করবেন?


3
আমি সবসময়ই ভেবেছিলাম যে OS n ইউনিক্সে নতুন লাইন ছিল OS r ওএস / এক্স এর আগে ম্যাকওএসে নতুন লাইন এবং উইন্ডোজে \ r on n নতুন লাইন। এছাড়াও, এটি বিবেচনা করে একটি স্ট্রিং হতে চলেছে যা কোনও ইমেল বার্তায় প্রদর্শিত হবে, আপনি এটি নিশ্চিত করতে চাইবেন যে আপনি যে কোনও উপায়ে এটি করছেন বেশিরভাগ কমান্ড মেল ক্লায়েন্টগুলিতে সঠিকভাবে প্রদর্শিত হবে। ইঙ্গিত: আউটলুক কিছু ক্ষেত্রে অতিরিক্ত নতুন লাইন অক্ষরগুলি সরিয়ে দেয়, তাই আপনি সর্বদা আপনার প্রত্যাশাটি পাবেন না।
কেনি দ্রব্ন্যাক

1
এগুলি সমস্ত গুরুত্বপূর্ণ কিনা তা নিশ্চিত নন, তবে মূলত দুটি 'নিউলাইন' অক্ষরটি তখন থেকেই এসেছিল যখন আপনার একটি শারীরিক টাইপরাইটার ছিল যা দুটি অক্ষর ব্যবহার করেছিল। পৃষ্ঠার বাম পাশে গাড়িটি পিছনে রাখার জন্য একটি (সিআর - 0xD), এবং একটি যার ফলে পৃষ্ঠাটি পরের লাইনে যাবে (এলএফ - 0 এক্সএ।) আমি নিশ্চিত যে এমন লোকেরা আছেন যারা এই বিষয়ে আরও বেশি জানেন যাহোক.
mkgrunder

উত্তর:


289

আপনার HEREDOC বা NOWDOC ব্যবহার করা উচিত।

$var = "some text";
$text = <<<EOT
  Place your text between the EOT. It's
  the delimiter that ends the text
  of your multiline string.
  $var
EOT;

হেরডোক এবং নওডোকের মধ্যে পার্থক্য হ'ল একটি হেরডোক এম্বেড করা পিএইচপি কোডটি কার্যকর হয়, যখন নওডোকের পিএইচপি কোডটি প্রিন্ট হয়ে যায়।

$var = "foo";
$text = <<<'EOT'
  My $var
EOT;

এই ক্ষেত্রে $ পাঠ্য মান থাকতে হবে My $var

দ্রষ্টব্য: সমাপ্তির আগে EOT;কোনও স্থান বা ট্যাব থাকা উচিত নয়। অন্যথায় আপনি একটি ত্রুটি পাবেন


কেন? কারণ প্রথম ইওটি এবং দ্বিতীয়টির মধ্যে থাকা সমস্ত কিছু যেমন হয় তেমন স্ট্রিং হিসাবে বিবেচিত হয়। যার অর্থ আপনার সমস্ত মাল্টি-লাইন স্ট্রিংগুলিতে ব্যাকস্ল্যাশ এন লাগানোর দরকার নেই। @ ফ্যাবিয়ান: একটি হারডোক এবং নওডোকের মধ্যে পার্থক্য কী, বা তারা কি একই জিনিস?
কেনি দ্রব্ন্যাক

4
@ পাউটাটাক: না, কারণ হেরডোক শেষ করতে এটি নতুন লাইনে থাকতে হবে। বিশেষত, এটির EOT;আগে এটি কোনও স্থান ছাড়াই থাকতে হবে।
পাওয়ারলর্ড

আমি নওডোকের জন্য একটি ব্যাখ্যা যুক্ত করেছি।
হাফদান

6
@ হাফদান, আমি কি কিছু মিস করছি? যখন আমরা কেবল "এন্টার" কীটি টাইপ করতে পারি এবং একটি সাধারণ স্ট্রিংয়ের মতো বহু-লাইন স্ট্রিংটি কোট দিয়ে ঘিরে রাখতে পারি তখন কেন হেরাদোকস এবং নোডকসের সাথে বিরক্ত হব ?
পেসারিয়ার 14

3
দয়া করে আপনার উত্তরে এটি যুক্ত করুন: শেষের আগে EOT;কোনও স্থান বা ট্যাব থাকা উচিত নয়। অন্যথায় আপনি একটি ত্রুটি পাবেন।
Shnd

44

আমি একই সিস্টেমটিকে পিক্স0r হিসাবে ব্যবহার করি এবং আমার মনে হয় যে কোডটি বেশ পঠনযোগ্য। কখনও কখনও আমি ডাবল উদ্ধৃতিতে লাইন বিরতি আলাদা করে যতদূর যেতে পারি এবং বাকী স্ট্রিংয়ের জন্য একক উদ্ধৃতি ব্যবহার করি। আপনি যদি ডাবল কোটেড স্ট্রিংয়ের ভিতরে ইনজেক্ট না করে কনট্যাকটেশন ব্যবহার করেন তবে এগুলি বাকী বাক্য থেকে আলাদা হয়ে যায় এবং ভেরিয়েবলগুলি আরও ভালভাবে দাঁড়ায়। সুতরাং আমি আপনার আসল উদাহরণ দিয়ে এরকম কিছু করতে পারি:

$text = 'Hello ' . $vars->name . ','
      . "\r\n\r\n"
      . 'The second line starts two lines below.'
      . "\r\n\r\n"
      . 'I also don\'t want any spaces before the new line,'
      . ' so it\'s butted up against the left side of the screen.';

return $text;

লাইন ব্রেক সম্পর্কে, ইমেলের সাথে আপনার সর্বদা \ r \ n ব্যবহার করা উচিত। PHP_EOL ফাইলগুলির জন্য যা পিএইচপি চলমান একই অপারেটিং সিস্টেমে ব্যবহৃত হতে পারে।


আপনি কি নিজের আইডিইতে সেই ইন্ডেন্টেশনটি সেট করেছেন (প্রতিটি অংশের সাথে একত্রিত বহুবিধ স্ট্রিং সেট করতে)?
Krzysztof Trzos

25

আমি দীর্ঘ পাঠ্যের জন্য টেমপ্লেট ব্যবহার করি:

ইমেল-টেমপ্লেট.টি.এস.টি রয়েছে

hello {name}!
how are you? 

পিএইচপি-তে আমি এটি করি:

$email = file_get_contents('email-template.txt');
$email = str_replace('{name},', 'Simon', $email);

আকর্ষণীয় ... আপনি কোনও ওয়েব অ্যাপ্লিকেশনের ডিরেক্টরি কাঠামোতে আপনার টেম্পলেটগুলি কোথায় সঞ্চয় করবেন?
অ্যান্ড্রু 19

আমার কোডটি একটি ডেমো মাত্র। বিশাল ওয়েব অ্যাপ্লিকেশানের জন্য আপনি / টেম্পলেট / ইমেল /, / টেমপ্লেটগুলি / ইউজারফিডব্যাক / এর মতো কাঠামো ব্যবহার করতে পারেন। তবে আপনার যদি আরও জিনিস থাকে তবে আমি স্মার্টের মতো একটি পূর্ণ টেম্পলেট সিস্টেমের প্রস্তাব করব।
পাওয়ারটাক

Dwoo dwoo.org একটি শালীন স্মার্ট-সামঞ্জস্যপূর্ণ পিএইচপি টেম্প্লেটিং সিস্টেম যা কিছু ভাল উত্তরাধিকারী হিসাবে বিবেচনা করে (পিএইচপি 5 তে শুরু হয়েছিল, তাই পিএইচপি 4 ব্যাগেজ নেই)।
মাইকাউইটম্যান

19

যুক্ত করে \nএবং / অথবা \rস্ট্রিংয়ের মাঝখানে, এবং কোডের খুব দীর্ঘ লাইন থাকা, যেমন দ্বিতীয় উদাহরণটির মতো, সঠিক মনে হয় না: আপনি কোডটি পড়লে ফলাফলটি দেখতে পাবেন না এবং আপনাকে স্ক্রোল করতে হবে ।

এই ধরণের পরিস্থিতিতে আমি সর্বদা হেরেডোক (বা পিএইচপি> = 5.3 ব্যবহার করে নাওডক) ব্যবহার করি: লিখতে সহজ, পড়তে সহজ, অতি-দীর্ঘ লাইনের প্রয়োজন নেই, ...

এই ক্ষেত্রে :

$var = 'World';
$str = <<<MARKER
this is a very
long string that
doesn't require
horizontal scrolling, 
and interpolates variables :
Hello, $var!
MARKER;

কেবল একটি জিনিস: শেষ চিহ্নিতকারী (এবং এর ;পরে ' ') অবশ্যই এর লাইনে একমাত্র জিনিস হতে হবে: এর আগে বা পরে কোনও স্থান / ট্যাব নেই!


12

অবশ্যই, আপনি হারডোক ব্যবহার করতে পারেন তবে কোড পঠনযোগ্যতাটি প্রথম উদাহরণের চেয়ে ভাল আর কিছু নয়, একাধিক লাইনে স্ট্রিং মোড়ানো।

আপনি যদি সত্যিই চান যে আপনার মাল্টি-লাইনের স্ট্রিংটি দেখতে ভাল লাগবে এবং আপনার কোডটি ভালভাবে প্রবাহিত হয় তবে আমি এই জাতীয় স্ট্রিংগুলি একসাথে যুক্ত করার পরামর্শ দিই:

$text = "Hello, {$vars->name},\r\n\r\n"
    . "The second line starts two lines below.\r\n"
    . ".. Third line... etc";

এটি HEREDOC বা মাল্টি-লাইন স্ট্রিংয়ের চেয়ে কিছুটা ধীর হতে পারে তবে এটি আপনার কোডের ইনডেন্টেশনের সাথে ভাল প্রবাহিত হবে এবং পড়তে সহজ করে তুলবে।


9

আমি জাভাস্ক্রিপ্টের জন্য এই পদ্ধতিটি আরও কিছুটা পছন্দ করি তবে এটি এখানে অন্তর্ভুক্ত হওয়া উপযুক্ত বলে মনে হয় কারণ এটি এখনও উল্লেখ করা হয়নি।

$var = "pizza";

$text = implode(" ", [
  "I love me some",
  "really large",
  $var,
  "pies.",
]);

// "I love me some really large pizza pies."

ছোট জিনিসগুলির জন্য, আমি দেখতে পাই যে কাঠের স্ট্রিংগুলির তুলনায় অ্যারে স্ট্রাকচারগুলির সাথে কাজ করা প্রায়শই সহজ।

সম্পর্কিত: ইমপ্লোড বনাম কনক্যাট কর্মক্ষমতা


1

যে বিশ্বাস করে

"abc\n" . "def\n"

মাল্টলাইন স্ট্রিং ভুল। এটি কনটেনটেশন অপারেটরের সাথে দুটি স্ট্রিং, কোনও মাল্টলাইন স্ট্রিং নয়। উদাহরণস্বরূপ, এই জাতীয় সংযুক্ত স্ট্রিংগুলি পূর্বনির্ধারিত অ্যারেগুলির কী হিসাবে ব্যবহার করা যায় না। দুর্ভাগ্যক্রমে পিএইচপি প্রকৃত মাল্টলাইন স্ট্রিং আকারে দেয় না

"abc\n"
"def\n"

কেবলমাত্র HEREDOCএবং NOWDOCসিনট্যাক্স, যা টেমপ্লেটগুলির জন্য আরও উপযুক্ত, কারণ নেস্টেড কোড ইন্ডেন্টটি এ জাতীয় সিনট্যাক্স দ্বারা ভেঙে যায়।


1

আপনি এটি ব্যবহার করতে পারেন:

<?php
ob_start();
echo "some text";
echo "\n";

// you can also use: 
?> 
some text can be also written here, or maybe HTML:
<div>whatever<\div>
<?php
echo "you can basically write whatever you want";
// and then: 
$long_text = ob_get_clean();

0

নিউলাইন এবং ক্যারেজ রিটার্ন সম্পর্কে আপনার প্রশ্নের ক্ষেত্রে:

আমি পূর্বনির্ধারিত গ্লোবাল ধ্রুবক PHP_EOL ব্যবহার করার পরামর্শ দেব কারণ এটি কোনও ক্রস-প্ল্যাটফর্মের সামঞ্জস্য সমস্যার সমাধান করবে।

এই প্রশ্নের তাই উত্থাপিত হয়েছে পূর্বেই এবং আপনার পড়ার মাধ্যমে আরো তথ্য জানতে পারেন " আমি পিএইচপি ধ্রুবক PHP_EOL ব্যবহার করবেন যখন "


1
এই উত্তরের মন্তব্যটি পরামর্শ দেয় যে ইমেলগুলিতে আমার নতুন লাইনগুলির জন্য আমার \ r \ n ব্যবহার করা উচিত: স্ট্যাকওভারফ্লো /
অ্যান্ড্রু

0

তবে নতুন লাইন এবং গাড়ীর রিটার্নের সাথে কী চুক্তি হয়েছে? পার্থক্য কি? \ N \ n \ r \ r বা \ n \ r এর সমতুল্য? আমি যখন লাইনের মধ্যে একটি লাইন ফাঁক তৈরি করি তখন আমার কোনটি ব্যবহার করা উচিত?

এখানে কেউই এই প্রশ্নের যথাযথ উত্তর দেবে বলে মনে হয় নি, তাই আমি এখানে আছি।

\r 'ক্যারেজ-রিটার্ন' উপস্থাপন করে

\n 'লাইন-ফিড' উপস্থাপন করে

তাদের আসল কারণটি আবার লেখকের কাছে ফিরে যায়। আপনি টাইপ করার সাথে সাথে 'ক্যারেজ' ধীরে ধীরে সারণী, চরিত্র অনুসারে, টাইপরাইটারের ডানদিকে যেতে হবে। আপনি যখন লাইনের শেষ প্রান্তে পৌঁছেছিলেন তখন আপনি গাড়িটি ফিরে আসবেন এবং তারপরে একটি নতুন লাইনে যাবেন । নতুন লাইনে যেতে, আপনি একটি লিভার ফ্লিপ করতে পারেন যা টাইপ লেখককে লাইনগুলি খাওয়াত । এইভাবে এই ক্রিয়াকলাপগুলি সম্মিলিতভাবে ক্যারেজ রিটার্ন লাইন ফিড বলে । এতটা আক্ষরিক:

একটি লাইন ফিড, এর \nঅর্থ পরবর্তী লাইনে চলে যাওয়া।

একটি ক্যারেজ রিটার্ন, এর \rঅর্থ লাইনটির শুরুতে কার্সারটি সরানো।

শেষ Hello\n\nWorldপর্যন্ত স্ক্রিনে নিম্নলিখিত ফলাফলের ফলাফল হওয়া উচিত:

Hello

     World

যেখানে নিম্নলিখিতHello\r\rWorld ফলাফলের ফলাফল হওয়া উচিত

এটি কেবলমাত্র 2 টি অক্ষরকে একত্রিত করার সময় \r\nআপনার জানা লাইনের সাধারণ ধারণা রয়েছে। IE এর Hello\r\nWorldফলাফল হওয়া উচিত:

Hello
World

এবং অবশ্যই \n\rহিসাবে একই ভিজ্যুয়াল আউটপুট ফলাফল হবে \r\n

মূলত কম্পিউটারের নেন \rএবং \nবেশ আক্ষরিক। যাইহোক, আজকাল গাড়ীর ফেরতের জন্য সমর্থন বিচ্ছিন্ন। সাধারণত প্রতিটি সিস্টেমে আপনি ব্যবহার করে পালিয়ে যেতে পারেন\n নিজের করে পালাতে পারবেন। এটি কখনই ওএসের উপর নির্ভর করে না, তবে আপনি কী আউটপুটটি দেখছেন তার উপর নির্ভর করে।

তবুও আমি সর্বদা \r\nআপনি যেখানেই পারেন ব্যবহার করার পরামর্শ দিই !

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.