SORU
14 EYLÜL 2011, ÇARŞAMBA


'farkı ne kapanışları vs PHP Javascript kapatma,?

Ne var JS kapaklar ve PHP kapanışları arasındaki farklar? Hemen hemen aynı şekilde çalışır? PHP kilitler yazarken farkında olmak, herhangi bir uyarı var mı?

CEVAP
14 EYLÜL 2011, ÇARŞAMBA


Tek fark, her ikisi de isimsiz bir işlev yürütülür kapsamında saklanması ile nasıl başa

// JavaScript:
var a = 1;
var f = function() {
   console.log(a);
};
a = 2;
f();
// will echo 2;

// PHP
$a = 1;
$f = function() {
    echo $a;
};
$a = 2;
$f();
// will result in a "PHP Notice:  Undefined variable: a in Untitled.php on line 5"

Bunu düzeltmek için use sözdizimi kullanmanız gerekecek dikkat:

$a = 1;
$f = function() use ($a) {
    echo $a;
};
$a = 2;
$f();
// but this will echo 1 instead of 2 (like JavaScript)

Anonim işleve sahip bir şekilde başvurular kullanman gerekecek JavaScript meslektaşı gibi davranır:

$a = 1;
$f = function() use (&$a) {
    echo $a;
};
$a = 2;
$f();
// will echo 2

Bu JavaScript ve PHP kapanışları arasındaki en çarpıcı fark olduğunu düşünüyorum.

İkinci farkher JavaScript kapatma this içerik mevcut olduğu anlamına gelir, bunu kullanabilirsiniz this iç kapağın kendisini (her ne kadar bu genellikle oldukça karmaşık bir şey bul this aslında ifade eder) - PHP mevcut kararlı sürüm (PHP 5.3) henüz destek $this içine kapanma, ama PHP yaklaşan sürümü (PHP 5.4) desteği $this bağlama ve yeniden birleştirme kullanarak $closure->bind($this) (Object Extension RFC daha fazla bilgi.)

Üçüncü farkher iki dilde kapatma özellikleri nesneye atanan nasıl tedavi edilir:

// JavaScript
var a = {
    b: function() {}
};
a.b(); // works


// PHP
$a = new stdClass();
$a->b = function() {};
$a->b(); // does not work "PHP Fatal error:  Call to undefined method stdClass::b() in Untitled.php on line 4"

$f = $a->b;
$f(); // works though

Aynı eğer kapaklar sınıfı tanımlar: özellikleri atanır

class A {
    public $b;

    public function __construct() {
        $this->b = function() {};
    }

    public function c() {
        $this->b();
    }
}
$a = new A();
// neither
$a->b();
// nor
$a->c();
// do work

Dördüncü fark:JavaScript kısıtlanmış nesneleri Kilitler nerede olduklarını tam teşekküllü nesneler vardır. Örneğin, PHP Kapatma olamaz Kendi özellikleri vardır:

$fn = function() {};
$fn->foo = 1;
// -> Catchable fatal error: Closure object cannot have properties

JavaScript ile yapabilirsiniz:

var fn = function() {};
fn.foo = 1;
fn.foo; // 1

Beşinci fark:İade kilitler hemen Javascript çağırdı olabilir:

var fn = function() { return function() { alert('Hi');}}
fn()();    

PHP değil:

$fn = function() { return function() { echo('Hi');};};
$fn()();     // syntax error

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ben Vivona

    Ben Vivona

    24 Ocak 2010
  • Glyn Dewis

    Glyn Dewis

    25 AĞUSTOS 2007
  • Joanna Okrajni

    Joanna Okraj

    4 EYLÜL 2010