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
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,:
- tek bir argüman olarak değerlendirir
etype-casts bir dize için sonuç değeri 75**. (Böyleceprint eeşdeğerdir. ** 77) - Akarsu dize 78* *the output buffer sonunda standart çıktıya yüklenecek olan).
- 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.

Referans karşılaştırma (==) bazı dizel...
Karşılaştırma Java numaralama üyeleri:...
Duyarlı Dize Karşılaştırma için SQL Du...
Zayıf bir referans ve sahipsiz bir baş...
Neden benim deÄŸiÅŸken sonra tam ben bir...