SORU
17 AĞUSTOS 2011, ÇARŞAMBA


Referans: Karşılaştırma PHP's print ve echo

PHP print echo arasındaki fark nedir?

Taşma çok soru PHP print echo kullanım anahtar kelime hakkında soru işaretlerine yol açtı yığını.

Bu yazının amacı reference kurallı bir soru sağlamak ve PHP print echo ilgili anahtar kelime cevap ve farklılıkları karşılaştırmak ve durumlarda kullanın.

CEVAP
17 AĞUSTOS 2011, ÇARŞAMBA


Neden iki oluşturur?

Gerçeği hakkındabaskıveechoiki ayrı yapılar olarak kullanıcılarına gözükse de, hem çok yankı tonları ise temel alırsanız, yani iç kaynak koduna bak. Kaynak kod çözümleyici olarak işlem kodu işleyicileri içerir. Sıfır numara görüntüleme gibi basit bir eylem düşünün. Echo veya print, "ZEND_ECHO_SPEC_CONST_HANDLER" çağrılacak. aynı işleyicisi kullanmak ister Baskı işleyicisi echo işleyicisi çağırır önce, yazdırma için dönüş değeri aşağıdaki gibi: 1, emin kılan bir şey yok

ZVAL_LONG(&EX_T(opline->result.var).tmp_var, 1);

(http://lxr.php.net/xref/PHP_5_6/Zend/zend_vm_execute.h#2412)

Değeri bir kolaylık dönüş koşullu ifadede baskı kullanmak için bir dilek. Neden 1 değil de 100? PHP 1 veya 100 truthiness boolean bağlamında 0 false bir değer olarak eşittir ise, yani doğru, aynı şey. PHP sıfırdan tüm değerleri (pozitif ve negatif truthy değerlerdir ve bu PHP Perl eski türemiştir.

Ama, eğer durum buysa, o zaman baskı ise echo al birden çok bağımsız değişken yalnızca bir kolu neden? Bu cevap için çözümleyici, özellikle dosyayı açmak için ihtiyacımız varzend_language_parser.y. Yankı ya da birden fazla ifade tek bir baskı da esneklik inşa (http://lxr.php.net/xref/PHP_5_6/Zend/zend_language_parser.y#734) sahip olur. baskı ise sadece bir ifade baskı sınırlıdır (http://lxr.php.net/xref/PHP_5_6/Zend/zend_language_parser.y#850).

Sözdizimi

C programlama dili ve dil etkilemesine PHP gibi, ifadeler ve deyimler arasında bir ayrım vardır. Sözdizimsel olarak, echo expr, expr, ... expr print expr bir değeri değerlendirir beri bir ifade olsa da bir ifadesidir. Bu nedenle, benzer ifadeleri, echo expr kendi üzerinde duruyor ve katılım aciz bir ifade:

5   echo 6;   // syntax error

Buna karşılık, print expr tek başına bir ifade biçimi:

print 5; // valid

Ya da, bir ifadenin bir parçası

x = (5 yazdırma 5); // 5 $ ( $x ) var_dump; // 6

Bir tekli bir operatör, ! ~ gibi olsaydı ancak bir operatör olarak print düşünmek için cazip olabilir. !, ~ and print ortak PHP yerleşik hepsi ve her biri sadece bir argüman alır. print garip ama geçerli bir oluşturmak için şu kodu kullanabilirsiniz:

    <?php 
    print print print print 7; // 7111

Sonuç son baskı bildirimi işlenen yazdıran tuhaf görünebilir ilk bakışta '7'ilk. Ama, daha derin kazmak ve gerçek işlem kodları bakarsanız mantıklı:

line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   3     0  >   PRINT                                            ~0      7
         1      PRINT                                            ~1      ~0
         2      PRINT                                            ~2      ~1
         3      PRINT                                            ~3      ~2
         4      FREE                                                     ~3
         5    > RETURN                                                   1

Oluşturulan alır ilk işlem kodu için karşılık gelen 'baskı 7'. '0 ~' 1 olan geçici bir değişkendir. Bu değişken olur ve geçici bir değişken ve işlem yinelenir döndüren bir sonraki yazdırma işlem kodu için işlenen. Son geçici değişken hiç alışmak değildir, kurtulmuş olur.

Neden print echo yok bir değeri döndürür?

İfadeleri değerleri değerlendirir. Örneğin 2 3 5, değerlendirir ve abs(-10) 37* *olarak değerlendirir. Beri print expr kendini ifade, o zaman delice bir değer ve tutarlı değeri 1 gösterir bir truthy sonucu ile dönen sıfır olmayan bir değer ifade olur yararlı servetin, başka bir ifade. Bu parçasında örneğin, yazdırma dönüş değeri işlev sırası belirlemede yararlıdır:

<?php

function bar( $baz ) { 
   // other code   
}
function foo() {
  return print("In and out ...\n");
}

if ( foo() ) {

     bar();
}

Göstermektedir: bir sonraki örnek olarak anında hata ayıklama gelince, belirli bir değeri yazdırmak bulabilirsiniz

<?php
$haystack = 'abcde';
$needle = 'f';
strpos($haystack,$needle) !== FALSE OR print "$needle not in $haystack"; 

// output: f not in abcde

Yan not, genel olarak, ifadeleri ifadeleri değildir; bir dönüş değeri yok. Bu durum, elbette vardır ifade ifadelerden baskı kullanmak ve hatta basit ifadeler kullanılan bir deyim gibi1;, sözdizimi, PHP devralır C ifadesi ifadesi olabilir bak garip ama çok yararlı, yapmak mümkün geçmek değişkenler fonksiyonlar.

print bir fonksiyonudur?

Hayır, bir dil yapısı. Tüm işlev çağrıları sırasında ifadeleri, print (expr) bir ifade, eğer işlev çağrısı sözdizimi kullanıyormuş gibi görünen visual rağmen. Gerçekte bu parantez parantez içinde ifade sözdizimi, yararlı ifade değerlendirme için. O zaman eğer bu ifade basit bir ise isteğe bağlı olduğu gerçeği, print "Hello, world!" gibi hesaplar. print (5 ** 2 6/2); // 28 gibi daha karmaşık bir ifade ile parantez yorumuna yardım. Fonksiyon isimleri farklı olarak, print is syntactically a keyword ve anlamsal bir 111**.

Terim "PHP genellikle" isset empty. "gibi işlevleri sözde ifade eder" dil yapısı Bu" tam olarak işlevleri gibi, aslında fexprs, onlar, bağımsız değerlendirmeye olmadan onları geçirilir, derleyici özel tedavi gerektirir. "yapıları olsa da print bir fonksiyonu olarak aynı şekilde bağımsız değerlendirmek üzere seçtiği bir fexpr olur.

Baskı get_defined_functions() tarafından görülebilir farkı: print işlevi listelenmiştir. 54**, gerçek işlevleri vardır.) aksine (printf ve yine de arkadaş olarak şunlardır:

Neden print(foo) o zaman çalışır?

echo(foo) çalışan aynı sebepten. Bu parantez ifadeleri yerine ilgilendirmeyen çünkü işlev çağrısı parantez oldukça farklıdır. Bir echo ( 5 8 ) kod olabilir ve görüntülemek için 13 (http://lxr.php.net/xref/PHP_5_6/Zend/zend_language_parser.y#1083) bir sonuç bekliyoruz. Bu parantezi bir ifade değerlendirmek yerine, bir işlev çağırma söz konusu. Not: Eğer koşullu ifadeler, atama listeleri, işlev bildirimleri, vb. gibi PHP parantez için başka kullanım alanları vardır

Neden print(1,2,3) 58 *sözdizimi hatası neden?

Sözdizimi print expr, echo expr ya echo expr, expr, ..., expr. PHP karşılaşmalar (1,2,3), çalışır için ayrıştırma gibi tek bir ifade ve başarısız olur, çünkü aksine C, PHP değil gerçekten bir ikili virgül operatörü, virgül hizmet olarak bir ayırıcı. ( İkili bir virgül için-döngüler, sözdizimi C. miras kaldı. PHP) yine de bulabilirsiniz

Anlambilim

Deyim 63* *echo e1; echo e2; ...; echo eN; için sözdizimsel şeker olarak anlaşılabilir.

Beri tüm ifadeler olan deyimler ve echo e hep aynı yan etki olarak print e ve dönüş değeri print e göz ardı kullanılan bir deyim, biz anlamak echo e olarak sözdizimsel şeker print e.

Bu iki gözlem echo e1, e2, ..., eN; print e1; print e2; ... print eN; için sözdizimsel şeker olarak görülebilir. (Ancak, non-semantik farklılıklar aşağıda zamanı unutmayın.)

Biz bu nedenle sadece print için semantik tanımlamak zorunda. Değerlendirildiğinde print e,:

  1. tek bir argüman olarak değerlendirir e type-casts bir dize için sonuç değeri 75**. (Böylece print e eşdeğerdir. ** 77)
  2. Akarsu dize 78* *the output buffer sonunda standart çıktıya yüklenecek olan).
  3. Tamsayı veren 1.

Bayt düzeyinde farklılıklar

print dönüş değişken (yalancı) doldurma küçük bir ek yük içerir

print 125;

PRINT  125,$temp     ; print 125 and place 1 in $temp 
UNSET  $temp         ; remove $temp

echo bir işlem kodu derler tek:

echo 125;

ECHO 125

çoklu değer echo birden çok işlem kodları derler

echo 123, 456;

ECHO 123
ECHO 456

Çoklu değer echo bağımsız değişkenler bir arada değil, ama onları tek bir çıkışı olduğunu unutmayın.

Başvuru: zend_do_print, zend_do_echo.

Zamanı farklılıklar

ZEND_PRINT izler (yalancı) olarak uygulanır

PRINT  var, result:

    result = 1
    ECHO var

Bu temelde sonuç değişkeni 1 delegeler ZEND_ECHO işleyicisi için gerçek bir iş koyar. ZEND_ECHO aşağıdakileri yapar

ECHO var:

    if var is object
        temp = var->toString()
        zend_print_variable(temp)
    else
        zend_print_variable(var)

zend_print_variable() gerçek gerçekleştirir, "" (aslında, bu sadece özel bir SAPI fonksiyon) yönlendirir. baskı

Hız: echo x vs print x

Aksineecho,baskıayırır geçici bir değişken. Ancak, süre bu faaliyet için harcanan ufacık, bu iki dil yapıları arasındaki fark önemsİzdİr.

Hız: echo a,b,c vs echo a.b.c

İlki üç ayrı ifadeleri derler. İkinci a.b.c., sonucu yazar ve hemen hizmetinde tüm ifadenin değerini hesaplar. Birleştirme bellek ayırmalarını ve kopyalama içerir bu yana, ilk seçenek daha verimli olacaktır.

Hangisi kullanılır?

Web uygulamaları, çıkış şablonları çoğunlukla yoğunlaşmıştır. Şablonları echo, diğer <?=, kullanmak beri mantıksal kod diğer bölgelerinde, echo da sopa gibi görünüyor. echo onları bitiştirmek birden fazla baskı olmadan ifade edememek ek bir avantaja sahip ve iade geçici bir değişken doldurma üstten bir ilgisi yok. Yani, echo kullanın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chilla Frilla™

    Chilla Frill

    7 Aralık 2006
  • Kayla Caton - Peet

    Kayla Caton

    23 HAZİRAN 2012
  • MysteryGuitarMan

    MysteryGuita

    16 HAZİRAN 2006