SORU
24 Temmuz 2009, Cuma


Bir dil yapısı ve bir &; dahili" PHP işlev " arasındaki fark nedir?

, , , *, echo, *printrequireisset5 ve bazı diğer fonksiyonlar ama dil yapıları olmadığını biliyorum.

Bu dil yapıları bazı parantez lazım, Diğerleri yok.

require 'file.php';
isset($x);

Bazı dönüş değeri var, bazılarının yok.

print 'foo'; //1
echo  'foo'; //no return value

Bu nedir yanibir dil yapısı ve yerleşik bir işlev arasındaki fark?

CEVAP
25 Temmuz 2009, CUMARTESİ


(Bu niyetim daha uzun; lütfen beni mazur görün.)

En çok dil uydurduğu bir şey olarak adlandırılan bir "sözdizimi": dil oluşur ve birkaç iyi tanımlanmış anahtar kelimeler ve eksiksiz ifadesi olan yapı içinde bu dili inşa bu sözdizimi.

Örneğin, diyelim ki bir basit dört işlevi aritmetik "dil" o zaman sadece tek basamaklı tamsayılar olarak girdi ve tamamen yok sayıyor sipariş işlemleri (senin o olduğunu söyledim basit bir dil). Bu dil sözdizimi tarafından tanımlanabilir:

// The | means "or" and the := represents definition
$expression := $number | $expression $operator $expression
$number := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
$operator :=   | - | * | /

Bu üç kural, tek haneli giriş aritmetik ifadeler herhangi bir sayıda oluşturabilirsiniz. Sonra bileşen türleri herhangi bir geçerli giriş ($expression, $number $operator) yıkar bu sözdizimi için bir ayrıştırıcı yazmak ve sonucu ile ilgilidir. Örneğin, 16* *ifadesi aşağıdaki gibi bölünebilir

// Parentheses used for ease of explanation; they have no true syntactical meaning
$expression = 3   4 * 5
            = $expression $operator (4 * 5) // Expand into $exp $op $exp
            = $number $operator $expression // Rewrite: $exp -> $num
            = $number $operator $expression $operator $expression // Expand again
            = $number $operator $number $operator $number // Rewrite again

Artık tamamen ayrıştırılmış bir sözdizimi, orijinal ifade için tanımlanmış dilimizde var. Bir kere bu biz miyiz geçmesi ve yazma bir ayrıştırıcı bulmak için sonuçları tüm kombinasyonları $number $operator $number ve tükür sonuç ne zaman biz sadece bir tane $number sol.

Al $expression yapıları orijinal ifadenin son ayrıştırılmış sürümünde kaldı hiç unutmayın. $expression Her zaman bizim dilimizde başka şey bir arada azaltılabilir çünkü.

PHP aynıydı: dil yapıları $number $operator bizim. eşdeğer olarak kabul edilirler Onlardiğer dil yapıları içine sığmazbunun yerine, bir dil inşa temel birimleri onlar. Fonksiyonları ve bu dil yapıları arasındaki en önemli fark: doğrudan dil yapıları ile. çözümleyici fiyatları Dil yapıları içine işlevleri kolaylaştırır.

Dil yapıları olabilir veya diğerleri yok iken parantez ve bazı dönüş değerleri nedeni gerektirmeyen sebebi tamamen PHP parser uygulaması belirli teknik detaylar bağlıdır. O çok bilgili çözümleyici nasıl çalıştığını değilim, bu soruları özellikle Adres veremem, ama bir saniye ile başlayan bir dil düşünün:

$expression := ($expression) | ...

Etkili bir şekilde, bu dil bulur, ifadeleri almak ve çevreleyen parantezler kurtulmak için ücretsizdir. PHP (ve ben buradayım istihdam saf varsayımları) işe benzer bir şey için kendi dil yapıları: print("Hello") olabilir düşürülen print "Hello" önce ayrıştırılır, ya da tersi (dil tanımları ekleyebilirsiniz parantez gibi onlardan kurtulmak).

Bu kök neden yapamazsın yeniden dil yapıları gibi echo print: onlar etkili bir şekilde kodlanmış içine çözümleyici, oysa fonksiyonları için eşlenen bir dizi dil yapıları ve ayrıştırıcı değiştirmek için olanak sağlar bu eşleştirme de derleme veya çalışma zamanı yerine kendi kümesinin dil yapıları veya ifadeler.

Günün sonunda, yapıları ve ifadeler arasındaki iç fark şudur: dil yapıları anlaşılır ve çözümleyici tarafından ele alınır. Yerleşik işlevleri dili tarafından sağlanan olsa da, ve ayrıştırma önce dil yapıları bir dizi eşleştirilmiş basitleştirilmiş.

Daha fazla bilgi:

  • Backus-Naur form sözdizimi resmi dil (yacc bu formu kullanır) tanımlamak için kullanılır

Düzenleme:Diğer cevapları okurken, insanlar iyi puan yapmak. Bunların arasında:

  • Dili yerleşik bir işlevi daha hızlı. Bu PHP yorumlayıcı ayrıştırma önce dil-yerleşik benzerlerine bu fonksiyon haritası gerek yok, çünkü gerçek sadece marjinal olursa. Modern bir makine olsa da, aradaki fark oldukça azdır.
  • Dil yerleşik hata denetimi atlar. Bu doğru olabilir veya her yerleşik PHP iç yürütmeye bağlı olmayabilir. Daha sık değil, işlevleri hata denetimi ve diğer işlevler yerleşiklere yok daha gelişmiş olacağı kesinlikle doğrudur.
  • Dil yapıları işlevini geri olarak kullanılabilir. Bu bir yapı olduğu için, doğrudurbir fonksiyonu. Ayrı varlıklar onlar. Sen yerleşik kod, bağımsız - yerleşik sözdizimi doğrudan çözümleyici tarafından ele alır ve yerleşik, yerine bir fonksiyonu olarak tanınan bir işlevi kodlama değilsin. (Bu daha kolay eğer sınıf ilk işlevleri ile dil düşünürseniz anlamak için olabilir: aslında, etrafındaki nesneler gibi. fonksiyonlar iletebilirsiniz Yerleşiklere ile bunu yapamazsın.)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • RaquelGamesBR

    RaquelGamesB

    20 HAZİRAN 2009
  • Ryan Billy

    Ryan Billy

    30 EKİM 2006
  • YEAH1TV

    YEAH1TV

    19 ŞUBAT 2009