SORU
9 ŞUBAT 2015, PAZARTESİ


Bu dinamik olarak $başvurusu iş değil, ama oluyor

PHP başı olarak belgeler Variable variables hakkında:

bu $dinamik referans edilemez özel bir değişkendir

Ancak yanlış bir şey gibi görünüyor, en azından PHP sürümü üzerinde test ettik (5.5.12).

class ThisIsBugged
{
    public function __construct()
    {
        ${'this'}->doSomething(); // This works, while it shouldn't
    }
}

Soru #1: Bunu nasıl yapabiliriz? Belgelere göre değil.

Ama daha fazlası var.

class ThisIsBugged
{
    public function __construct()
    {
        // This does not work, but it could. See below.
        ${'th' . 'is'}->doSomething();
    }
}

Beklendiği gibi, yürütme durur

PHP Uyarı: Tanımsız değişken: bu

PHP Ölümcül hata: bir üye işlev birşey Çağrı() olmayan nesne.

Deyim {'th' . 'is'} değerlendirilmiş not:"Tanımlanmamış değişken:" . bu .

Ancak (bu da tuhaf!), açıkça özel değişken referans $this, tüm düzeltmeleri dinamik başvuruları yöntem içerisinde veya sonrasında, daha önce kullanılan.

class ThisIsBugged
{
    public function __construct()
    {
        // Now it works while it shouldn't
        ${'th' . 'is'}->doSomething();

        // This fixes both the previous and the subsequent calls
        $unused = $this;

        // Now it works while it shouldn't
        ${'th' . 'is'}->doSomething();
    }
}

Soru #2Nasıl $this açık bir başvuru bütün yöntemi $this tüm diğer dinamik başvurur tamir EDEBİLİR MİSİN?

CEVAP
9 ŞUBAT 2015, PAZARTESİ


PHP derlenen değişkenler (CV) optimizasyon dediğimiz bir kavram kullanır. Bu değerlerine değişken adları eşleştiren bir karma tablo kullanmak yerine, düz dizi ve bir dizin kullanmak anlamına gelir. Derleyici hangi dizini karşılık gelen bilir. Sahne dizi dizin aramaları karma tablo arama yapmak oldukça hızlıdır.

$this değişken de bu şekilde depolanacak ve dizin için özel olarak op_array->this_var olarak hatırlanır. Eğer $this hiçbir faydası bulunursa bu değeri başlatılmamış sol -1. VM üzerine yeni bir yürütme içeriği zorlandığında yığın PHP -1 mi, başlatılamıyor $this değişken girdi değil mi op_array->this_var ve, kontrol edecek.

Değişken erişirken, PHP CV tablo ile yürüme mesafesinde ve buna uygun sembol bir karma tablo inşa edecek. Tabii ki sadece aslında CV tablosunda hangi değişkenler ekleme $this içermese bile tanımsız değişken bir arama ile bitireceğiz.

Şimdi düşünün üç vaka:

  1. $this ${"this"} PHP derleyici ile ilgili olarak aynı değişken adı her iki durumda derleme zamanında bilinen sonra ().
  2. PHP 5 gibi.x derleyici henüz sabit ifade katlanır gerçekleştirmez, ancak ${"th"."is"} $this bir erişim olduğunu tespit etmek mümkün olmayacaktır. this_var öyle kalır başlatılmamış.
  3. $this düz bir kullanımı var son durum, gibi this_var set ve değişken-değişken bir arama yoluyla da erişilebilir olacak.

Durum 7 - her zaman $this dolaylı aramaları her zaman çalışması gerektiği çok değişken bir arama this_var set edeceğiz PHP farklı olduğunu unutmayın.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chaoticmoogle

    Chaoticmoogl

    13 ŞUBAT 2006
  • Dirty Loops

    Dirty Loops

    21 Mayıs 2007
  • Submissions101

    Submissions1

    23 ŞUBAT 2007