PHP İç içe sınıfları çalışmak ...

3 Cevap php

Yani, eğer böyle bir iç içe geçmiş sınıf yapmak için deneyin:

//nestedtest.php

class nestedTest{
    function test(){
         class E extends Exception{}
         throw new E;
    }
}

Sen bir hata alırsınız Fatal error: Class declarations may not be nested in [...]

ama sen gibi ayrı bir dosyada bir sınıf varsa:

//nestedtest2.php

class nestedTest2{
    function test(){
         include('e.php');
         throw new E;
    }
}

//e.php
class E Extends Exception{}

Peki, neden bunu yapmanın ikinci hacky yolu çalışır, ancak bunu yapmanın olmayan hacky yönlü çalışmıyor?

3 Cevap

Manuel (http://php.net/manual/en/function.include.php):

When a file is included, the code it contains inherits the variable scope of the line on which the include occurs. Any variables available at that line in the calling file will be available within the called file, from that point forward. However, all functions and classes defined in the included file have the global scope.

İkinci yol sınıfların iç içe değildir. Sadece ilk örnekten farklı olan bir dosya olarak hem bildirimlerinde var. PHP bunu bir örgütsel karar değil bir gerekliliktir bir dosyada birden çok sınıf bildirimleri olabilir.

Bir yöntem içinde bir sınıf tanımlamak için iyi bir sebep yok. Sınıf yine tüm diğer tanımlanmış sınıfları olarak aynı kapsam / ad var - 2 yolu sadece bir hata atmak değil o anlamda "çalışıyor". Yani, aslında bu senaryoda bir sınıf "iç içe" değil.

Bir sınıf sadece bir tanımdır, çünkü arada, çalışır nedeni - bir sınıf tanımlarken ile ilgili hiçbir yürütme yoktur. Yani bu dosya (e.php) en kısa sürede bunu dahil olarak ayrıştırılır ve daha sonra kendi sınıf geçerli yürütme bağlamında kullanılabilir hale gelir. Kod sadece çalıştırılabilir bölümleri (yani, throw new E;) aslında arayanın kapsamına ait olacaktır.