HEREDOC স্ট্রিংয়ের মধ্যে পিএইচপি ফাংশন কল করা


92

পিএইচপি-তে, HEREDOC স্ট্রিং ঘোষণাগুলি এইচটিএমএলের একটি ব্লক আউটপুট দেওয়ার জন্য সত্যই কার্যকর useful আপনি এটিকে কেবল $ দিয়ে উপস্থাপনের মাধ্যমে ভেরিয়েবলগুলিতে বিশ্লেষণ করতে পারেন তবে আরও জটিল বাক্য গঠন (যেমন $ var [2] [3]) এর জন্য আপনাকে নিজের প্রকাশটি ces ces ধনুর্বন্ধনীগুলির মধ্যে রাখতে হবে।

পিএইচপি 5, এটা হয় আসলে {} একটি HEREDOC স্ট্রিং ভিতরে ধনুর্বন্ধনী মধ্যে ফাংশন কল করার জন্য সম্ভব, কিন্তু আপনি কাজ একটি বিট মাধ্যমে যেতে হবে। ফাংশনটির নামটি নিজেই একটি ভেরিয়েবলে সংরক্ষণ করতে হবে এবং আপনাকে এটি ডায়ামিনিক-নামক ফাংশনটির মতো কল করতে হবে। উদাহরণ স্বরূপ:

$fn = 'testfunction';
function testfunction() { return 'ok'; }
$string = <<< heredoc
plain text and now a function: {$fn()}
heredoc;

আপনি দেখতে পাচ্ছেন যে এটি কেবল চেয়ে কিছুটা বেশি অগোছালো:

$string = <<< heredoc
plain text and now a function: {testfunction()}
heredoc;

প্রথম কোড উদাহরণের পাশাপাশি আরও কিছু উপায় রয়েছে যেমন ফাংশনটি কল করার জন্য HEREDOC ভেঙে ফেলা, বা সমস্যাটি বিপরীত করা এবং এর মতো কিছু করা:

?>
<!-- directly output html and only breaking into php for the function -->
plain text and now a function: <?PHP print testfunction(); ?>

পরবর্তীটির অসুবিধা রয়েছে যে আউটপুট সরাসরি আউটপুট স্ট্রিমের মধ্যে রাখা হয় (যদি না আমি আউটপুট বাফারিং ব্যবহার করি), যা আমি চাই তা নাও হতে পারে।

সুতরাং, আমার প্রশ্নের সারমর্মটি হ'ল: এটির কাছে যাওয়ার জন্য আরও কি মার্জিত উপায় আছে?

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


4
এটি আপনার প্রশ্নের জোরালোভাবে উত্তর নয়, তবে হেরডোকের বিবৃতিতে ফাংশন কলগুলির জন্য দুর্বল সমর্থন দেওয়া, আমি সাধারণত হেরেডোক প্রিন্ট করার আগে স্ট্রিংগুলি উত্পন্ন করি। তারপরে, আমি কেবল Text {$string1} Text {$string2} Textহেরডোকের মতো কিছু ব্যবহার করতে পারি ।
রিনোগো

উত্তর:


51

আমি ব্যক্তিগতভাবে ব্যক্তিগতভাবে এই জন্য হেরডোক ব্যবহার করব না। এটি কেবলমাত্র একটি ভাল "টেম্পলেট বিল্ডিং" সিস্টেমের জন্য তৈরি করে না। আপনার সমস্ত এইচটিএমএল একটি স্ট্রিংয়ে লকড রয়েছে যার বিভিন্ন অসুবিধা রয়েছে

  • WYSIWYG এর জন্য কোনও বিকল্প নেই
  • আইডিই থেকে HTML এর জন্য কোনও কোড সমাপ্তি নেই
  • আউটপুট (এইচটিএমএল) লজিক ফাইলগুলিতে লক করা আছে
  • লুপিংয়ের মতো আরও জটিল টেম্প্লেটিংয়ের জন্য আপনি এখন যা করার চেষ্টা করছেন তার মতো হ্যাকগুলি ব্যবহার করতে হবে

একটি মৌলিক টেম্পলেট ইঞ্জিন পান, বা কেবলমাত্র অন্তর্ভুক্ত সহ পিএইচপি ব্যবহার করুন - এই কারণেই ভাষাটির <?phpএবং ?>সীমানার রয়েছে।

টেমপ্লেট_ফিল.এফপি

<html>
<head>
  <title><?php echo $page_title; ?></title>
</head>
<body>
  <?php echo getPageContent(); ?>
</body>

index.php

<?php

$page_title = "This is a simple demo";

function getPageContent() {
    return '<p>Hello World!</p>';
}

include('template_file.php');

8
প্রতিধ্বনির জন্য একটি শর্টহ্যান্ড রয়েছে: <?=$valueToEcho;?>বা <%=$valueToEcho;%>আপনার আইএনআই সেটিংসের উপর নির্ভরশীল।
পিটার বেইলি

4
এই শর্টহ্যান্ডগুলি ব্যবহার করার বিষয়ে আমি যা পড়েছি তার বেশিরভাগই বলে যে এগুলি ব্যবহার করা একটি খারাপ অভ্যাস এবং আমি সম্মত। দুর্ভাগ্যক্রমে আপনি যদি বিতরণের জন্য কোড লিখছেন তবে আপনি সেই আইএনআই সেটিংসের উপর নির্ভর করতে পারবেন না এইভাবে তাদের জন্য বিতরণকৃত কোডের জন্য পিএইচপি'র "সমর্থন" তৈরি করবে। এফডাব্লুআইডাব্লু, আমাকে অন্য ব্যক্তির ওয়ার্ডপ্রেস প্লাগইনগুলিতে একাধিকবার বাগগুলি ঠিক করতে হয়েছিল কারণ তারা এই শর্টহ্যান্ডগুলি ব্যবহার করেছিল।
মাইকস্কিঙ্কেল

4
না, আমি বলছি না যে আমার পক্ষে characters টি চরিত্র টাইপ করতে হবে এটি লজ্জাজনক; আপনি আমার সমস্যাগুলি ভুলভাবে গুণিত করেছেন। এটি যে টাইপিংয়ের সাথে আমি উদ্বিগ্ন তা নয়, এটি পড়া । এই অক্ষরগুলি প্রচুর ভিজ্যুয়াল শব্দের সৃষ্টি করে যা উত্স কোডটি স্ক্যান করা এবং কোডটি কী করছে তা বোঝার পক্ষে আরও শক্ত করে তোলে। আমার জন্য ক্ষুদ্রতম ব্যক্তিও এ অনেক একটি HEREDOC পড়ার জন্য সহজ। (এবং বিটিডব্লিউ, এটি প্রদত্ত এইচটিএমএল খণ্ডে এটি কতবার ব্যবহৃত হয়েছে character চরিত্রের সময় But তবে আমি
খনন

12
সংক্ষিপ্ত সুন্দর, পরিষ্কার এবং পড়া সহজ। আপনার মতামত সালে <?=$title?>হয় অনেক ? <পিএইচপি প্রতিধ্বনি $ শিরোনাম তুলনায় nicer; ?> নেতিবাচক দিকটি হ্যাঁ, বিতরণের জন্য প্রচুর ইনির সংক্ষিপ্ত ট্যাগ বন্ধ রয়েছে। তবে , অনুমান কি ?? পিএইচপি 5.4 হিসাবে, ইনআই সেটিংস নির্বিশেষে পিএইচপিতে সংক্ষিপ্ত ট্যাগগুলি সক্ষম করা আছে! সুতরাং আপনি যদি 5.4+ প্রয়োজনীয়তার সাথে কোডিং করে থাকেন (আসুন ধরুন আপনি বৈশিষ্ট্যগুলি ব্যবহার করছেন, উদাহরণস্বরূপ), এগিয়ে যান এবং সেই দুর্দান্ত শর্ট ট্যাগগুলি ব্যবহার করুন !!
জিম্বো

4
যাইহোক, শর্ট ট্যাগগুলি বন্ধ থাকলেও <? = $ Blah?> 5.4 এ ডিফল্ট হিসাবে সক্ষম হয় is
কলমেটওয়ান

72

আপনি যদি সত্যিই এটি করতে চান তবে ক্লাস ব্যবহারের চেয়ে কিছুটা সহজ আপনি ব্যবহার করতে পারেন:

function fn($data) {
  return $data;
}
$fn = 'fn';

$my_string = <<<EOT
Number of seconds since the Unix Epoch: {$fn(time())}
EOT;

দুর্দান্ত @ সিজেডেনিস! এটি হেরডোকের অভ্যন্তরে ফাংশন কল ব্যবহারের জন্য সর্বোত্তম এবং পরিষ্কার সমাধান। কিছু পরিস্থিতিতে চমৎকার উত্স আছে। আমার সাইটে আমি ট্যাবিনডেক্স অবস্থান উত্পন্ন করার জন্য ফাংশন কল সহ ফিল্ড সেটের 22 টি লাইন (ফর্ম লুপের মধ্যে একটি হারডোক ব্লক) সহ ফর্ম উত্পন্ন করার জন্য হেরিডক ব্যবহার করি।
পাওলো বুশসবাউম

আপনি এমনকি এটি করতে পারেন:$my_string = "Half the number of seconds since the Unix Epoch: {$fn(time() / 2 . ' Yes! Really!')}";
সিজে ডেনিস

4
আরো কম্প্যাক্ট সংজ্ঞা: $fn = function fn($data) { return $data; };
devsmt

4
আপনি ঠিক বলেছেন এবং আরও খাটো হ'ল:$fn = function ($data) { return $data; };
সিজে ডেনিস

ওহ, গোডেগল্ফ? ঠিক আছে, আমাকে প্রবেশ $fn=function($data){return $data;};
করান: এইটি

42

আমি নিম্নলিখিত করতে হবে:

$string = <<< heredoc
plain text and now a function: %s
heredoc;
$string = sprintf($string, testfunction());

আপনি যদি এটিকে আরও মার্জিত মনে করেন তবে নিশ্চিত নন ...


17

এটি চেষ্টা করুন (হয় বৈশ্বিক পরিবর্তনশীল হিসাবে, বা আপনার যখন প্রয়োজন হয় তা ইনস্ট্যান্টিয়েটেড):

<?php
  class Fn {
    public function __call($name, $args) {
      if (function_exists($name)) {
        return call_user_func_array($name, $args);
      }
    }
  }

  $fn = new Fn();
?>

এখন যে কোনও ফাংশন কল $fnউদাহরণ দিয়ে যায় । সুতরাং বিদ্যমান ক্রিয়াকলাপটি testfunction()একটি বংশগত সাথে ডাকা যেতে পারে{$fn->testfunction()}

মূলত আমরা সমস্ত ফাংশন একটি শ্রেণীর উদাহরণে মোড়ানো করছি এবং __call magicক্লাস পদ্ধতিটি ম্যাপ করার জন্য পিএইচপি এর পদ্ধতিটি ব্যবহার করে প্রকৃত ফাংশনটি কল করা প্রয়োজন।


4
এটি যখন আপনি কোনও বিদ্যমান প্রকল্পে কেবল একটি টেম্প্লেটিং ইঞ্জিন যুক্ত করতে না পারেন তখন এটির জন্য ভাল সমাধান। ধন্যবাদ, আমি এখন এটি ব্যবহার করছি।
ব্র্যান্ডন

পারফরম্যান্স সমালোচনামূলক হলে ব্যাপকভাবে ব্যবহার করা উচিত নয়: আমি বেশ কয়েকবার পড়েছি পারফরম্যান্স খারাপ হওয়ার জন্য call_user_func_array, শেষ বারের জন্য মন্তব্য করেছেন php.net: php.net/manual/en/function.call-user-func-array.php # 97473
মার্কাস

সুন্দর! আমি এটা ভালবাসি, আমি কেন এই ভেবে দেখিনি?!? :-)
মাইকস্কিঙ্কেল

11

সম্পূর্ণতার জন্য, আপনি !${''} কালো ম্যাজিক পার্সার হ্যাক ব্যবহার করতে পারেন :

echo <<<EOT
One month ago was ${!${''} = date('Y-m-d H:i:s', strtotime('-1 month'))}.
EOT;

8
আপনি কি হোগওয়ার্টসে গেছেন?
স্টারেক্স

এটি কাজ করে কারণ false == ''। দৈর্ঘ্যের 0 ( '') নামের সাথে একটি ভেরিয়েবল সংজ্ঞায়িত করুন । আপনি যে মানটি চান সেটি সেট করুন ( ${''} = date('Y-m-d H:i:s', strtotime('-1 month')))। এটি নেগেট করুন ( !) এবং এটিকে একটি ভেরিয়েবল ( ${false}) এ রূপান্তর করুন । falseএকটি স্ট্রিং রূপান্তর করা প্রয়োজন, এবং (string)false === ''। যদি আপনি একটি মিথ্যা মান মুদ্রণ করার চেষ্টা করেন তবে এটির পরিবর্তে ত্রুটি ঘটবে। নিম্নলিখিত পংক্তি উভয় truthy এবং falsy মান কাজ করে, এমনকি আরো অপাঠ্য হচ্ছে খরচে: "${(${''}=date('Y-m-d H:i:s', strtotime('-1 month')))!=${''}}"
সিজে ডেনিস

আপনি NANপাশাপাশি মুদ্রণ করতে চান , ব্যবহার করুন "${(${''} = date('Y-m-d H:i:s', strtotime('-1 month')) )==NAN}"
সিজে ডেনিস

9

আমি কিছুটা দেরি করেছি, তবে আমি এলোমেলোভাবে এটি পেরিয়ে এসেছি। ভবিষ্যতের যে কোনও পাঠকের জন্য, আমি সম্ভবত এখানে যা করব:

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

আমি যা বলতে চাইছি তা এখানে:

টেমপ্লেট ফাইল:

<?php echo "plain text and now a function: " . testfunction(); ?>

লিপি:

<?php
ob_start();
include "template_file.php";
$output_string = ob_get_contents();
ob_end_clean();
echo $output_string;
?>

সুতরাং স্ক্রিপ্টটিতে তার বাফারে টেম্পলেট_ফিল.পিএফ অন্তর্ভুক্ত রয়েছে, কোনও ফাংশন / পদ্ধতি চালানো এবং কোনও চলক পথ নির্ধারণ করে। তারপরে আপনি কেবল বাফারের সামগ্রীগুলি একটি ভেরিয়েবলের মধ্যে রেকর্ড করুন এবং এটি দিয়ে যা চান তা করুন।

আপনি যদি দ্বিতীয় পৃষ্ঠায় এটি পৃষ্ঠাতে প্রতিধ্বন করতে না চান সেভাবে, আপনার দরকার নেই। আপনি লুপ করতে পারেন এবং আউটপুট আউট করার আগে স্ট্রিং এ যুক্ত রাখতে পারেন।

আমি মনে করি আপনি যদি কোনও টেম্প্লেটিং ইঞ্জিন ব্যবহার করতে না চান তবে সেটাই সবচেয়ে ভাল উপায়।


6

এই স্নিপেট ইউজারস্কোপের মধ্যে আপনার সংজ্ঞায়িত ফাংশনগুলির নামের সাথে ভেরিয়েবলগুলি সংজ্ঞায়িত করবে এবং তাদের একই স্ট্রিংয়ের সাথে বাঁধবে। আমাকে প্রদর্শন করুন।

function add ($int) { return $int + 1; }
$f=get_defined_functions();foreach($f[user]as$v){$$v=$v;}

$string = <<< heredoc
plain text and now a function: {$add(1)}
heredoc;

এখন কাজ করবে।


@ মিশেলম্যাক মিলিলিয়ান এর চেয়ে ভাল কোন ভেরিয়েবলের কোনও ফাংশন হিসাবে একই নাম আছে, ঠিক আছে?
s3c

6

মোড়ানো কার্যকারণের সাথে এখানে দুর্দান্ত সমাধান খুঁজে পেয়েছে: http://blog.nazdrave.net/?p=626

function heredoc($param) {
    // just return whatever has been passed to us
    return $param;
}

$heredoc = 'heredoc';

$string = <<<HEREDOC
\$heredoc is now a generic function that can be used in all sorts of ways:
Output the result of a function: {$heredoc(date('r'))}
Output the value of a constant: {$heredoc(__FILE__)}
Static methods work just as well: {$heredoc(MyClass::getSomething())}
2 + 2 equals {$heredoc(2+2)}
HEREDOC;

// The same works not only with HEREDOC strings,
// but with double-quoted strings as well:
$string = "{$heredoc(2+2)}";

4
আমি এর ঠিক 2.5 বছর আগে ঠিক একই সমাধানের পরামর্শ দিয়েছি। stackoverflow.com/a/10713298/1166898
সিজে ডেনিস

5

আমি মনে করি যে হেরডোক ব্যবহার করা HTML কোড উত্পন্ন করার জন্য দুর্দান্ত। উদাহরণস্বরূপ, আমি নিম্নলিখিত প্রায় সম্পূর্ণ অপঠনযোগ্য দেখতে পাই।

<html>
<head>
  <title><?php echo $page_title; ?></title>
</head>
<body>
  <?php echo getPageContent(); ?>
</body>

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

আমি মনে করি নিম্নলিখিতটি বেশ পঠনযোগ্য:

$page_content = getPageContent();

print <<<END
<html>
<head>
  <title>$page_title</title>
</head>
<body>
$page_content
</body>
END;

দুর্ভাগ্যক্রমে, যদিও এটি আপনার ফাংশনটিকে একটি ভেরিয়েবলের সাথে আবদ্ধ করার জন্য আপনার প্রশ্নে একটি ভাল পরামর্শ ছিল, শেষ পর্যন্ত, এটি কোডে জটিলতার একটি স্তর যুক্ত করে, যা মূল্যহীন নয়, এবং কোডটি কম পাঠযোগ্য করে তোলে, যা হ'ল বংশগতির প্রধান সুবিধা।


4
অন্যান্য 4 টি পদ্ধতির তুলনায় গত 4 বছর এটি আরও স্মার্ট প্রমাণ করেছে। আপনার টেম্পলেটগুলিতে রচনা ব্যবহার করে (ছোট পৃষ্ঠাগুলির সমন্বয়ে একটি বৃহত পৃষ্ঠা তৈরি করা) এবং সমস্ত নিয়ন্ত্রণের যুক্তি পৃথক করে রাখা যিনি টেম্প্লেটিং সম্পর্কে গুরুতর তার পক্ষে স্ট্যান্ডার্ড পদ্ধতির: ফেসবুকের রিঅ্যাকটিজেএস এটির জন্য (যেমন এক্সএইচপি), এক্সএসএলটি হিসাবে (যা যা আমি ভালবাসি না, তবে একাডেমিকভাবে সাবলীল)। একমাত্র স্টাইলিস্টিক নোট যা আমি তৈরি করেছি: আমি আমার ওয়ারগুলির চারপাশে সর্বদা use use ব্যবহার করি, মূলত পাঠযোগ্যতার ধারাবাহিকতার জন্য এবং পরে দুর্ঘটনা এড়াতে। এছাড়াও, ব্যবহারকারীদের থেকে আসা কোনও ডেটা এইচটিএমএল স্পেশালচার্স () এ ভুলে যাবেন না।
জোশি কেরিবউ থেকে

4

আমি স্মার্টিকে একটি টেম্পলেট ইঞ্জিন হিসাবে দেখে নেব - আমি নিজে অন্য কোনও চেষ্টা করিনি, তবে এটি আমাকে ভালভাবে সম্পাদন করেছে।

আপনি যদি আপনার বর্তমান পদ্ধতির সান টেম্পলেটগুলির সাথে লেগে থাকতে চান তবে আউটপুট বাফারিংয়ের এত খারাপ কী? এটি আপনাকে কল করতে চান এমন ফাংশনগুলির স্ট্রিং নামগুলি ভেরিয়েবলগুলি ঘোষণার চেয়ে অনেক বেশি নমনীয়তা দেবে।


3

আপনি ল্যাম্বদা ফাংশনটি ভুলে যাচ্ছেন:

$or=function($c,$t,$f){return$c?$t:$f;};
echo <<<TRUEFALSE
    The best color ever is {$or(rand(0,1),'green','black')}
TRUEFALSE;

আপনি create_function ফাংশনটিও ব্যবহার করতে পারেন


2

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

2

@ সিজেডেনিস প্রস্তাবটি ব্যবহার করে এখানে একটি চমৎকার উদাহরণ:

function double($i)
{ return $i*2; }

function triple($i)
{ return $i*3;}

$tab = 'double';
echo "{$tab(5)} is $tab 5<br>";

$tab = 'triple';
echo "{$tab(5)} is $tab 5<br>";

উদাহরণস্বরূপ, HEREDOC সিনট্যাক্সের জন্য একটি ভাল ব্যবহার হ'ল একটি ডাটাবেসে মাস্টার-বিশদ সম্পর্কের সাথে বিশাল আকার তৈরি করে। যে কোনও একটি ফোর নিয়ন্ত্রণের মধ্যে HEREDOC বৈশিষ্ট্যটি ব্যবহার করতে পারে, প্রতিটি ক্ষেত্রের নামের পরে প্রত্যয় যুক্ত করে। এটি একটি সাধারণ সার্ভার সাইড টাস্ক।



1
<div><?=<<<heredoc
Use heredoc and functions in ONE statement.
Show lower case ABC="
heredoc
. strtolower('ABC') . <<<heredoc
".  And that is it!
heredoc
?></div>

1

এটি পিএইচপি 7.x এ আজ আরও কিছুটা মার্জিত

<?php

$test = function(){
    return 'it works!';
};


echo <<<HEREDOC
this is a test: {$test()}
HEREDOC;

0
<?php
echo <<<ETO
<h1>Hellow ETO</h1>
ETO;

তোমার এটা চেষ্স্টা করা উচিত . ইটিও শেষ হওয়ার পরে; কমান্ড আপনি একটি প্রবেশ দেওয়া উচিত।

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