2011-07-20 8 views
8

me encontré con una clase PHP escrito por un empleado anterior que se define así:¿Clase que se extiende?

namespace SomeNamespace; 

class SomeClass extends ::SomeClass 
{ 
    private function __construct() {} 

    public static function someFunction() 
    { 
     //Do something 
    } 
} 

Podría alguien explicar qué está pasando aquí? ¿Esta clase se está extendiendo? Sé que un singleton usaría un constructor privado, pero no estoy seguro de que eso esté sucediendo aquí.

La clase real tiene que ver con el almacenamiento en caché. No estoy seguro si eso ayuda.

+2

¿se ejecuta sin errores? ¿Y estás seguro de que ambas clases están en el mismo espacio de nombres? – zzzzBov

+2

¡Buena pregunta! Nunca he visto un código como ese antes. O el empleado anterior era un genio o una persona loca. – GordonM

+0

Soy reacio a ejecutar la clase en este momento. ¡Pero si!Hay una línea que define un espacio de nombres sobre la definición de la clase (actualicé la pregunta para reflejar esto). –

Respuesta

6

No creo que pueda hacer este tipo de cosas usando ::; pero debería funcionar si está usando el separador de espacio de nombres: \

Acabo de probar con PHP PHP 5.3.5 - y el uso de :: en efecto, me sale un error.
El uso de \, por otro lado, funciona muy bien (vea el ejemplo a continuación).


Por ejemplo, estar en el espacio de nombres global (fuera de cualquier espacio de nombres específico) se podría definir una clase SomeClass:

namespace { 

    class SomeClass 
    { 
     public function method() { 
      var_dump("child: " . __METHOD__); 
     } 
    } 


    $obj = new SomeNamespace\SomeClass(); 
    $obj->method(); 

} 


Y, en un espacio de nombres específico llamado SomeNamespace en mi ejemplo , se podría definir una clase SomeClass que extendería la clase desde el espacio de nombres global, que está accesible como \SomeClass:

namespace SomeNamespace { 

    class SomeClass extends \SomeClass 
    { 
     public function method() { 
      var_dump("parent: " . __METHOD__); 
     } 
    } 

} 


Nota al margen: aquí, he utilizar el bracketed syntax, como yo estoy poniendo las dos porciones de código en el mismo archivo (véase el Ejemplo 3 en esa página del manual) - pero debería funciona igual con varios archivos.



Tenga en cuenta que con las primeras versiones alpha de PHP 5.3, el separador de espacio de nombres no \ era, pero ::

Por lo tanto, si usted está usando PHP 5.3 alpha 1 o 2 (y tal vez 3, no estoy seguro de si \ ha sido elegido antes o después de alpha 3), usando :: podría funcionar.

(Por supuesto, no debería estar usando un alfa - especialmente teniendo en cuenta que ha habido versiones estables de PHP 5.3 desde hace dos años)

+0

¡Sí! Estamos ejecutando una versión alfa de PHP. No necesitamos comentar sobre eso ahora :-) –

+2

Ergh, realmente no deberías ejecutar un alfa, ¡especialmente uno tan antiguo! El día que cambies a una versión estable, todo tu código de espacio de nombres se romperá ... * (lo siento, no pude resistirme a comentar ^^ Me alegro de poder ayudar, sin embargo) * –

+0

Jaja sí, ¡es terrible! –

2

Si mal no recuerdo durante el desarrollo de 5.3 :: se usó como el separador de espacio de nombres.

Cuestiones relacionadas