Yorumlu metin dizeleri içinde PHP fonksiyonları çağıran

13 Cevap php

PHP, heredoc dize bildirimleri html bloğunu çıkış için gerçekten yararlıdır. Bunu sadece $ ile önek ile değişkenlerin ayrıştırmak olabilir, ancak daha karmaşık sözdizimi için ($ var gibi [2] [3]), içeride {} parantez ifadenizi koymak zorunda.

PHP 5, bu is mümkün aslında {} bir heredoc dize içinde parantez içinde bir işlev çağrıları, ancak iş biraz geçmek zorunda yapmak için. İşlev adı kendisi bir değişkende saklanır vardır, ve bunu bir dinamik adlı fonksiyonu gibi aramak zorunda. Örneğin:

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

Gördüğünüz gibi, bu biraz daha dağınık sadece daha:

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

Böyle işlevini çağırmak için heredoc çıkmayı, ya da sorunu ters ve benzeri bir şey yapıyor gibi ilk kod örneği dışında başka yolları vardır:

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

İkincisi ne istiyorum olmayabilir ki, (Ben, çıktı tamponlama kullanıyorum sürece) çıkışı doğrudan çıkış akışı içine konur dezavantajı vardır.

Yani, benim soru özü: Bu yaklaşım daha şık bir yolu var mı?

Edit based on responses: Bu kesinlikle şablon motoru çeşit benim hayat çok daha kolay kılacak gibi görünüyor, ama bana temelde benim her zamanki PHP tarzı ters gerektirir. Bu kötü bir şey, ama benim ataleti açıklıyor değil .. Gerçi hayatı kolaylaştırmak için yollar bulmaktan kadar değilim, bu yüzden şimdi şablonlar içine arıyorum.

13 Cevap

Ben şahsen, bunun için de tüm heredoc kullanmak olmaz. Bu sadece iyi bir "şablon bina" sistemi için yapmaz. Tüm HTML çeşitli dezavantajları vardır bir dize aşağı kilitli

  • WSYIWYG için seçenek yok
  • IDE HTML yok kod tamamlama
  • Çıkış (HTML) mantık dosyaları kilitli
  • Bu tür döngü gibi, daha karmaşık çiftleşmiş elde etmek için şimdi yapmak için çalışıyoruz ne gibi kesmek kullanmak zorunda sona

Temel bir şablon motoru olsun, ya da sadece içerir ile PHP kullanmak - biz sınırlayıcılarınıda neden bu.

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

Ben aşağıdaki yapardın:

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

Değil bu daha zarif olmak düşünecektim eğer emin ...

Eğer gerçekten bunu yapmak istiyorum ama kullanabileceğiniz bir sınıfını kullanarak biraz daha basit eğer:

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

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

(Global bir değişken ya da ihtiyacınız olduğunda örneği olarak da) bu deneyin:

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

  $fn = new Fn();
?>

Şimdi herhangi bir fonksiyon çağrısı $fn Mesela geçer. Bu nedenle, mevcut işlev testfunction() {$fn->testfunction()} ile bir metin bildiriminde çağrılabilir

Temelde bir sınıf örneğine tüm fonksiyonları sarma ve çağrılacak gerek gerçek işlevine sınıf yöntemi haritasına PHP'nin __call magic yöntemi kullanıyor.

Ben biraz geciktim, ama rastgele karşıya geldi. Gelecek herhangi bir okuyucu, burada muhtemelen yapardım:

Ben sadece bir çıktı tamponu kullanmak istiyorsunuz. Yani temelde, sen tampon içeriğini almak ve bir dize bunları yazmak, sonra bunun içine, vb herhangi bir fonksiyon, değişkenler, ile "şablon dosyası" dahil, () ob_start kullanılarak tamponlama başlatın ve sonra tampon kapatın. Sonra size herhangi bir fonksiyonu çalıştırmak, gerek herhangi bir değişken kullandım ve hala HTML sözdizimi IDE mevcut vurgulayarak var.

İşte ne demek istediğimi:

Template File:

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

Script:

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

Yani komut dosyası herhangi bir işlevleri / yöntemleri çalışan ve yol boyunca herhangi bir değişken atama, onun tampon içine template_file.php içerir. Sonra sadece onunla istediğiniz ne bir değişkenin içine tamponunun içeriğini kaydetmek ve mutlaka.

O saniyede sayfa sağa üzerine yankı istemiyorsanız Bu şekilde, gerek yok. Sen döngü ve keep it çıktısını almadan dize ekleyerek yapabilirsiniz.

Ben size bir çiftleşmiş motoru kullanmak istemiyorsanız gitmek için en iyi yol olduğunu düşünüyorum.

Bu pasajı userscope içinde tanımlanan fonksiyonların adı ile değişkenleri tanımlamak ve aynı adı içeren bir dize için onları bağlamak olacaktır. Bana göstermek olsun.

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;

Şimdi çalışacaktır.

Ben bir şablon motoru olarak Smarty bakmak istiyorum - Ben başka olanları kendim denemedim, ama beni iyi yaptı.

Geçerli yaklaşım sans şablonları ile sopa istedim, ne çıktı tamponlama hakkında bu kadar kötü? Bu size aramak istediğiniz fonksiyonların acı isimler değişkenleri bildirmek zorunda daha fazla esneklik vereceğim.

Ben yorumlu metin kullanarak HTML kodu üretmek için harika olduğunu düşünüyorum. Örneğin, ben şu neredeyse tamamen okunmaz bulabilirsiniz.

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

Ancak, sadeliği elde etmek için size başlamadan önce fonksiyonlarını değerlendirmek zorunda kalıyor. Ben bunu yaparken, genellikle iyi bir fikir ekran, sizin hesaplama ayıran sona beri, böyle korkunç bir kısıtlama olduğuna inanmıyorum.

Ben şu oldukça okunabilir olduğunu düşünüyorum:

$page_content = getPageContent();

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

Ne yazık ki, bir değişkene işlevini bağlamak için söz yapılan iyi bir öneri olsa bile, sonunda, öyle ki, değmez kod, karmaşıklık düzeyi ekler ve kod daha az okunaklı hale getirir yorumlu metin en önemli avantajı.

Hemen hemen bir çiftleşmiş motoru ne nitelendiriyor. Açıkçası oldukça iyi php biliyorum. Eğer gerçek bir çiftleşmiş motoru olarak bir göz alarak düşündünüz mü?

A bit late but still. This is possible in heredoc!

Have a look in the php manual, section "Complex (curly) syntax"

Çocuklar aynı zamanda çift tırnakla çalışır dikkat etmelisiniz.

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

İlginç ucu zaten.

İşte CJDennis önerisi @ kullanarak güzel bir örnektir:

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

Örneğin, yorumlu metin için iyi bir kullanımı Veritabanı master-detay ilişkisi ile büyük formları oluşturmak olduğunu. Bir her alan adından sonra bir sonek ekleyerek, kontrol İÇİN içinde heredoc özelliğini kullanabilirsiniz. Bu tipik bir sunucu tarafı görev.

Eğer lambda fonksiyonu hakkında unutmadan:

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

Ayrıca fonksiyon create_function kullanabilirsiniz