2012-08-06 10 views
11

Tengo modeloCómo llamar a la función padre desde la instancia del hijo?

BaseUser.class.php 
User.class.php 
UserTable.class.php 

En la clase de usuario he estado anula la función de eliminación

class User extends BaseUser { 
    function delete(){ 
    } 
} 

Ahora, si quiero llamar a los padres función de borrado .... ¿cómo?

Ejemplo

$user = new User(); 
$user->delete(); // will call the overridden delete 
$user-> ?? ;  // want to call parent delete 
+0

¿Has probado '$ user-> parent :: delete();'? – Matt

+0

sí, lo intenté pero no funcionó ... netbeans lo muestra como una semántica incorrecta –

+0

¿Qué pasa cuando ejecuta el código en su navegador? – Matt

Respuesta

28

Técnicamente, esto no es posible desde el "exterior" (la interfaz pública) por una buena razón.

Si ha entendido por qué (leer otra cosa más adelante), y que en realidad saber lo que haces, no hay ninguna razón para realmente no ofrecen la funcionalidad:

class User extends BaseUser { 
    ... 
    function parentDelete(){ 
     parent::delete(); 
    } 
    ... 
} 

user = new User(); 
$user->delete(); // will call the overridden delete 
$user->parentDelete();  // want to call parent delete 

Sin embargo, si alguna vez hecho esto, usted debe sepa que ha usado mal la herencia de alguna manera. Esta debe ser una situación excepcional ya que no puedo imaginar ninguna situación en la que realmente necesite eso para hacerlo.

Por lo tanto, intente formular por qué necesita esa funcionalidad para obtener mejores sugerencias.

Why is that bad?

Por una razón muy simple: en su software que no es necesario saber que $user tiene un padre o no. Ese es un detalle que no debería importarle en absoluto.

Eso le permitirá reemplazar cualquier objeto de usuario que tenga en su software con un proyecto de usuario posterior. Esto es importante ya que desea cambiar su software a lo largo del tiempo.

Si haces que los detalles internos formen parte de la interfaz pública, te estás robando a ti mismo la posibilidad de mantener las cosas flexibles. No ser flexible es realmente una mala situación.

7

quizás tratar este

parent::delete(); 
+0

tengo el objeto del usuario $ usuario cómo llamar a este objeto? –

+1

debe llamar al método padre en el método secundario – voodoo417

+1

@HUGO: no puede. Desde el exterior, ambos son iguales. No hay dos, sino un objeto. Para eso es la herencia. – hakre

1

creo que busca las funciones PHP parent:

<?php 
class A { 
    function example() { 
    echo "I am A::example() and provide basic functionality.<br />\n"; 
    } 
} 

class B extends A { 
    function example() { 
    echo "I am B::example() and provide additional functionality.<br />\n"; 
    parent::example(); 
    } 
} 

$b = new B; 

// This will call B::example(), which will in turn call A::example(). 
$b->example(); 
?> 

Si su clase no tiene una función llamada getMyFunction() llamando al $b->getMyFuction() llamará a la función principal. Si lo hace, llamará a la función child, a menos que la función child llame a la función prent.

+0

Great A :: example() .... cómo llamar a esta función en este objeto $ b –

+0

Creo que OP necesita saber si '$ b-> parent :: example();' funcionará. – Matt

+0

@HUGO $ b> example() se ejecutará de la siguiente manera: Si no hay 'example()' en la clase secundaria, el padre se ejecutará. Si hay una función 'example()' en el hijo, se ejecutará en su lugar. – Fluffeh

1

¿Por qué necesita ampliar delete si necesita llamar al padre una vez?

¿Por qué no crear una eliminación personalizada?

igual:

public function customDelete() 
{ 
    parent::delete(); 

    // do extends delete here 
} 

continuación, puede eliminar un objeto utilizando ->customDelete() y también se puede llamar al método de eliminación de los padres, ya que no ha redefinido el método delete():

$user = new User(); 
$user->customDelete(); // will call the overridden delete 
$user->delete(); // will call the parent (since you didn't override it) 

Y si realmente necesita anular la función delete(), aún puede crear una especie de elemento primario eliminar:

public function parentDelete() 
{ 
    return parent::delete(); 
} 

continuación:

$user = new User(); 
$user->delete(); // will call the overridden delete 
$user->parentDelete(); // will call the method that only call the parent 
0

He encontrado en this thread codingforums. Lo que dice (y estoy de acuerdo con ellos) es que si tiene una función/método anulado en una clase secundaria, una instancia de ese objeto SIEMPRE llamará al método secundario.

La palabra clave parent es similar a $this o self y solo se puede invocar desde la misma clase.

Si desea que un objeto hijo sea capaz de llamar al método parent, basta con crear otro método

function parentExample() { 
    parent::example(); 
} 

que sólo llama al método padres.

Cuestiones relacionadas