2012-04-12 22 views
9

De acuerdo con php, clase :: auto siempre apunta a la clase en sí, sino como anoté estos códigos, algo extraño sucede:¿Cómo funciona el "yo" exactamente en las clases heredadas?

class C_foo{ 
    function foo() { return "foo() from C_foo"; } 
    function bar() { echo self::foo(); } 
} 

class C_bar extends C_foo{ 
    function foo() { return "foo() from C_bar"; } 
} 

C_foo::bar(); 
C_bar::bar(); 

pensé que la salida hubiera sido:

foo() from C_foo 
foo() from C_bar 

Pero, de hecho:

foo() from C_foo 
foo() from C_foo 

significa que el auto en clase padre no hereda exactamente en el niño, funciona más como esto:

foo() {return parent::foo();} 

¿Eso es una característica de PHP o es un error? ¿O es eso ser así?

De lo contrario, se produjo tal cosa como he tratado de contar una clase crear objetos a partir de sí mismo, el código es algo como esto:

class Models { 
    function find($exp) { 
     ... 
     ... 

     $temp_model = new self(); 
     ... 
     ... 
    } 
} 

class Something extends Models {...} 

$somethings = Something::find("..."); 

Tal vez alguien podría preguntar: "¿Por qué no se establece una variable con el valor de clase, y usa la variable como la función __construction? "

De esta manera:

... 
... 
function find($exp) { 
    ... 
    ... 
    $class_name = __class__; 
    $temp_model = new $class_name(); 
    ... 
    ... 
} 
... 

De hecho lo hice, y consiguió un resultado aún más raro:

sólo funciona cuando la clase no tiene ninguna propiedad o función, pero find(), o un Me saltó un error al decirme que una variable muestra dónde debería existir una función.

Respuesta

-3

En PHP, las clases no son un objeto. Debido a eso, no hay herencia de métodos estáticos (en realidad, son similares a las funciones globales).

Entonces, cuando C_foo dice auto, siempre significa C_foo (incluso si llama un método de C_bar).

Si desea crear instancias a partir de un método de clase abstracta, debe probar el patrón de fábrica.

+0

Muchas gracias, voy a probar el patrón de fábrica :) –

1

Esto se debe a que la clase que recibe los métodos del padre es de esa clase. Entonces:

$ bar es Bar, por lo tanto, self :: se refiere a Bar, no a Foo. Aunque ese método es de Foo.

Esto puede ser diferente de Java, pero probablemente indica cómo PHP está haciendo herencia internamente.

+0

Ahora estoy tratando de cambiar mi código, y puede ser realmente necesito profundizar en este idioma, muchas gracias :) –

+0

Sí, php piensa en la herencia de manera diferente. Es menos una 'pila' y más una 'fusión'. –

+0

... hm ... Ya veo, puede ser que me lleve algo de tiempo acostumbrarme ... –

16

Parece que está describiendo la característica de PHP conocida como 'enlace estático tardío'.

PHP proporciona dos sintaxis: self:: y static::.

static se introdujo en PHP 5.3 porque mucha gente esperaba que self funcionara lo que usted está describiendo.

Consulte el manual de PHP para más: http://php.net/manual/en/language.oop5.late-static-bindings.php

+0

buscando en el documento ~ gracias :) –

Cuestiones relacionadas