2012-05-17 34 views
17

¿Los rasgos en php5.4 están sujetos a carga automática?php5.4 rasgos de carga automática

Todavía no tengo un entorno para probar, pero no puedo ver ninguna mención de ello en __autoload en php.net o en la página de rasgos, pero parece que los rasgos se comportan como clases en algunos aspectos.

¿Alguien ha intentado esto todavía?

ACTUALIZACIÓN:

he encontrado una solicitud aquí: https://bugs.php.net/bug.php?id=61265 (2012-03-03 13:10 GMT)

que parece sugerir que hace el trabajo, pero no de forma explícita. ¿Alguien puede confirmar que se llamará a un __autoload() directo por un rasgo perdido?

ACTUALIZACIÓN: Confirmado - funciona como se esperaba - __autoload obtendrá rasgos, aunque conseguir que php5.4 funcione la primera vez parece ser un desafío mayor.

Gracias, MyStream

Respuesta

55

De acuerdo con el manual, la función trait_exists() toma un valor booleano como segundo parámetro, que se relaciona con la carga automática; lo que parece indicar que los rasgos y la autocarga no son dos ideas incompatibles.

Además, si echa un vistazo al código fuente de esa función trait_exists(), verá una sección de código, condicionada por ese segundo parámetro, que se parece bastante a lo que puede ver en la fuente- código de class_exists().
Por lo tanto, yo diría que por segunda vez que los rasgos y carga automática no son ideas incompatibles ;-)

(no me he PHP 5.4 instalado en mi equipo actual, por lo que no puedo comprobar por mí mismo - pero , mirando el código ...)



[editar] OK, he acaba de compilar PHP 5.4.3 , la versión estable actual:

$ /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 

Probemos el siguiente porción corta del código, que se guarda como temp-2.php, y trata de usar un rasgo que no se declara en este archivo:

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(); 

Básicamente, si la carga automática funciona para los rasgos , "AUTOLOAD" y se debe mostrar el nombre de mi rasgo.

Por lo tanto, vamos a tratar de ejecutar esa porción de código - y aquí está el resultado me sale:

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

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

Por lo tanto, la función de carga automática (en este caso, un anónimo uno - no, pero eso cambio una cosa) se llama ...
... lo que significa que rasgos están, con PHP 5.4.3, sujetos a la carga automática.

+5

No solo lo instaló, sino que también probó y brindó una muy buena respuesta. +1 excelente respuesta. ¡Gracias! – MyStream

+0

De nada :-) * (Yo quería instalar 5.4 desde hace mucho tiempo - finalmente lo he hecho ^^) * –

2

confirmada así:

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 

Se tratan como clases porque se implementan como modiffied (?) Clases.

Por ejemplo, actualmente tienen un comportamiento residual de las clases: pueden tener propiedades.

En teoría no deberían y no deberías confiar en que tengan esta habilidad. En el futuro, probablemente se eliminará gradualmente.

+0

Gracias por eso, muy útil respuesta y consejo. +1 Será muy interesante ver cómo se desarrolla. – MyStream

+0

IMO es una sintaxis muy mala/torpe. Permitir propiedades en rasgos (si continúa). B. básicamente permite la herencia múltiple "completa". Me había emocionado probar esta función al igual que cuando hablaba de espacios de nombres en @ php5.3 y de nuevo una decepción. –

+0

También en php5.4 tenemos la resolución del valor de retorno de la función directa: explode ('', 'Mihai Stancu') [1] == 'Stancu', y la sintaxis de la matriz ['key' => 'value']. –