2012-05-17 15 views
17

Czy cechy w php5.4 podlegają automatycznemu ładowaniu?właściwości autoloadingu php5.4:

Nie mam jeszcze środowiska do przetestowania, ale nie widzę żadnej wzmianki o nim na __autoload na php.net lub stronie cech, ale wydaje się, że cechy zachowują się jak klasy pod pewnymi względami.

Czy ktoś próbował już to?

UPDATE:

znalazłem wniosek tutaj: https://bugs.php.net/bug.php?id=61265 (2012-03-03 13:10 UTC)

który wydaje się sugerować, że działa, ale nie w sposób jawny. Czy ktokolwiek może potwierdzić, że prosta funkcja __autoload() zostanie wywołana z powodu brakującej cechy?

UPDATE: potwierdzone - to działa zgodnie z oczekiwaniami - __autoload pobierze cechy, chociaż coraz php5.4 do pracy po raz pierwszy wydaje się być większym wyzwaniem.

Dzięki MyStream

Odpowiedz

55

Według instrukcji, funkcja trait_exists() przyjmuje wartość logiczną jako drugi parametr, który jest związany z autoloading; co zdaje się wskazywać, że cechy i autoload nie są dwoma sprzecznymi ideami.

Ponadto, jeśli spojrzysz na kod źródłowy tej funkcji trait_exists(), zobaczysz sekcję kodu, uwarunkowaną tym drugim parametrem, która wygląda dość podobnie do tego, co widać w źródle kod class_exists().
Tak, powiedziałbym, że po raz drugi i autoload cechy nie są niezgodne pomysły ;-)

(nie zostały zainstalowane PHP 5.4 na mojego obecnego komputera, więc nie mogę sprawdzić samemu - ale , patrząc na kod ...)



[edytuj] OK, właśnie opracowywane PHP 5.4.3, obecna stabilna wersja:

$ /usr/local/bin/php --version 
PHP 5.4.3 (cli) (built: May 17 2012 21:11:42) 
Copyright (c) 1997-2012 The PHP Group 
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies 

Spróbujmy następujący krótki fragment kodu, który jest zapisany jako temp-2.php i próbuje użyć cechę, że nie jest zadeklarowana w tym pliku:

spl_autoload_register(function ($name) { 
    echo "AUTOLOAD :: "; 
    var_dump($name); 
}); 

class MyClass { 
    use MyTrait; // Let's try to use a trait that is not declared in this file 
} 

$obj = new MyClass(); 
$obj->plop(); 

Zasadniczo, jeśli autoloading pracuje dla cech , "AUTOLOAD", a nazwa mojej cechy powinna być wyświetlona.

Więc spróbujmy wykonujący tę część kodu - i tu jest wynikiem uzyskać:

$ /usr/local/bin/php ./temp-2.php 
AUTOLOAD :: string(7) "MyTrait" 

Fatal error: Trait 'MyTrait' not found in /.../temp-2.php on line 13 

Więc funkcja autoloading (tutaj anonimowy jeden - ale to nie zmienia rzecz) jest nazywane ...
... co oznacza, że ​​cechy są, w PHP 5.4.3, podlegają automatycznemu ładowaniu.

+5

Nie tylko zainstalowałeś go, ale również przetestowałeś i dostarczyłeś bardzo dobrą odpowiedź. +1 doskonała odpowiedź. Dziękuję Ci! – MyStream

+0

Nie ma za co :-) * (Chciałem zainstalować 5.4 od dłuższego czasu - w końcu to zrobiłem ^^) * –

2

Potwierdzony także:

PHP 5.4.3-1~dotdeb.0 (cli) (built: May 8 2012 20:49:26) 

Fatal error: Trait 'x' not found in /.../index.php on line 12 

Są one traktowane jako klasy, ponieważ są one realizowane jako (modiffied?) Klas.

Na przykład obecnie mają one zachowanie szczątkowe z zajęć: mogą być właścicielami nieruchomości.

Teoretycznie nie powinny, a użytkownik nie powinien polegać na posiadaniu tej umiejętności. W przyszłości prawdopodobnie zostanie wycofany.

+0

Dziękuję za to - bardzo przydatna odpowiedź i porady. +1 Bardzo interesujące będzie zobaczyć, jak się rozwija. – MyStream

+0

IMO to bardzo zła/niezdarna składnia. Dopuszczanie właściwości w cechach (jeśli trwa). B.asically pozwala na "pełne" wielokrotne dziedziczenie. Byłem podekscytowany, aby przetestować tę funkcję, tak jak miałem do przestrzeni nazw z powrotem @ php5.3, i ponownie rozczarowanie. –

+0

Również w php5.4 mamy bezpośrednią funkcję zwracającej wartości rozdzielczości: explode ('', 'Mihai Stancu') [1] == 'Stancu' i składnia tablic ['key' => 'value']. –