سؤال

في PHP، تعد إعلانات سلسلة HEREDOC مفيدة حقًا لإخراج كتلة من html.يمكنك تحليلها في المتغيرات فقط عن طريق وضع البادئة $، ولكن بالنسبة إلى بناء الجملة الأكثر تعقيدًا (مثل $var[2][3])، يجب عليك وضع التعبير داخل الأقواس {}.

في PHP 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(); ?>

الأخير له عيب وهو أن الإخراج يتم وضعه مباشرة في دفق الإخراج (ما لم أستخدم التخزين المؤقت للإخراج)، وهو ما قد لا يكون ما أريده.

لذا فإن جوهر سؤالي هو:هل هناك طريقة أكثر أناقة للتعامل مع هذا؟

التعديل بناءً على الردود: من المؤكد أنه يبدو أن نوعًا ما من محركات القوالب من شأنه أن يجعل حياتي أسهل بكثير، لكنه سيتطلب مني بشكل أساسي عكس أسلوب PHP المعتاد.ليس هذا أمراً سيئاً، لكنه يفسر جمودي..أنا على استعداد لاكتشاف طرق لجعل الحياة أسهل، لذلك أبحث في القوالب الآن.

هل كانت مفيدة؟

المحلول

لن أستخدم HEREDOC على الإطلاق لهذا الغرض شخصيًا.إنه لا يشكل نظامًا جيدًا "لبناء القالب".يتم تأمين كل HTML الخاص بك في سلسلة لها العديد من العيوب

  • لا يوجد خيار لـ WYSIWYG
  • لا يوجد إكمال التعليمات البرمجية لـ HTML من IDEs
  • الإخراج (HTML) مقفل على الملفات المنطقية
  • سينتهي بك الأمر إلى استخدام الاختراقات مثل ما تحاول القيام به الآن لتحقيق قوالب أكثر تعقيدًا، مثل التكرار

احصل على محرك قالب أساسي، أو استخدم PHP مع التضمينات فقط - ولهذا السبب تمتلك اللغة <?php و ?> محددات.

template_file.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');

نصائح أخرى

إذا كنت تريد حقًا القيام بذلك ولكن بشكل أبسط قليلاً من استخدام فصل دراسي، يمكنك استخدامه:

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

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

سأفعل ما يلي:

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

لست متأكدًا مما إذا كنت تعتبر هذا أكثر أناقة ...

جرب هذا (إما كمتغير عام، أو تم إنشاء مثيل له عندما تحتاج إليه):

<?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()}

في الأساس، نقوم بتغليف جميع الوظائف في مثيل فئة، واستخدام PHP __call magic طريقة لتعيين طريقة الفصل إلى الوظيفة الفعلية التي يجب استدعاؤها.

لقد تأخرت قليلا، ولكنني وجدت ذلك بشكل عشوائي.لأي قراء مستقبليين، هذا ما سأفعله على الأرجح:

سأستخدم فقط المخزن المؤقت للإخراج.لذا، عليك أن تبدأ عملية التخزين المؤقت باستخدام ob_start()، ثم تقوم بتضمين "ملف القالب" الخاص بك مع أي وظائف أو متغيرات وما إلى ذلك.داخله، احصل على محتويات المخزن المؤقت واكتبها في سلسلة، ثم أغلق المخزن المؤقت.ثم استخدمت أي متغيرات تحتاجها، ويمكنك تشغيل أي وظيفة، ولا يزال لديك تمييز بناء جملة HTML متاحًا في IDE الخاص بك.

وهنا ما أعنيه:

ملف نموذجي:

<?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;
?>

لذلك يتضمن البرنامج النصي template_file.php في المخزن المؤقت الخاص به، وتشغيل أي وظائف/طرق وتعيين أي متغيرات على طول الطريق.ثم تقوم ببساطة بتسجيل محتويات المخزن المؤقت في متغير وتفعل ما تريد به.

وبهذه الطريقة، إذا كنت لا ترغب في تكرار ذلك على الصفحة في تلك اللحظة مباشرةً، فلن تضطر إلى القيام بذلك.يمكنك التكرار والاستمرار في الإضافة إلى السلسلة قبل إخراجها.

أعتقد أن هذه هي أفضل طريقة إذا كنت لا ترغب في استخدام محرك القوالب.

للحصول على الاكتمال، يمكنك أيضًا استخدام !${''} السحر الأسود اختراق المحلل اللغوي:

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

سيحدد هذا المقتطف المتغيرات بأسماء الوظائف المحددة ضمن نطاق المستخدم ويربطها بسلسلة تحتوي على نفس الاسم.اسمحوا لي أن أظهر.

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;

سوف تعمل الآن.

أعتقد أن استخدام heredoc يعد أمرًا رائعًا لإنشاء تعليمات برمجية بتنسيق 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;

لسوء الحظ، على الرغم من أنه كان اقتراحًا جيدًا قدمته في سؤالك لربط الوظيفة بمتغير، فإنه في النهاية يضيف مستوى من التعقيد إلى الكود، وهو أمر لا يستحق، ويجعل الكود أقل قابلية للقراءة، وهو الميزة الكبرى للheredoc.

وجدت حلاً لطيفًا مع وظيفة التغليف هنا: 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)}";

أود أن ألقي نظرة على ذكي كمحرك قوالب - لم أجرب أي محرك آخر بنفسي، لكنه أفادني جيدًا.

إذا كنت تريد الاستمرار في نهجك الحالي بلا القوالب، ما هو السيء في التخزين المؤقت للإخراج؟سوف يمنحك مرونة أكبر بكثير من الاضطرار إلى الإعلان عن المتغيرات التي تمثل الأسماء الثابتة للوظائف التي تريد الاتصال بها.

متأخرا بعض الشيء ولكن لا يزال.هذا ممكن في هيردوك!

قم بإلقاء نظرة على دليل PHP، القسم "بناء الجملة المعقد (المجعد)"

هنا مثال جميل باستخدام اقتراحCJDennis:

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 داخل عنصر التحكم FOR، مع إضافة لاحقة بعد كل اسم حقل.إنها مهمة نموذجية من جانب الخادم.

لقد نسيت وظيفة لامدا:

$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

يجب أن يلاحظ الرجال أنه يعمل أيضًا مع السلاسل ذات علامات الاقتباس المزدوجة.

http://www.php.net/manual/en/language.types.string.php

نصيحة مثيرة للاهتمام على أي حال.

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

عليك بتجريبه .بعد انتهاء اتفاقية التجارة الإلكترونية؛الأمر الذي يجب عليك إدخاله.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top