2 votes

Extension de classes en PHP - comportement étrange

Tout d'abord, citons le manuel de PHP ( http://php.net/manual/en/keyword.extends.php ) :

The extended or derived class has all variables and functions of the
base class (this is called 'inheritance' despite the fact that nobody
died) and what you add in the extended definition.

Pourquoi cet exemple simple ne fonctionne-t-il pas ?

<?php

class A
{
    private function a() 
    { 
        echo 'a'; 
    }

    public function b() 
    { 
        echo 'b'; 
    }

}

class B extends A 
{
    //no extended definition, only what's inherited 
}

$object_B = new B();

echo $object_B->b(); // fatal error: Call to private A::a() from invalid context 
?>

Après quelques expériences, il s'avère que l'élimination des méthode a de la classe A le fait fonctionner. Et je ne l'appelle même pas n'importe où.

3voto

Zac Brown Points 373

Vous pouvez utiliser une méthode du même nom comme constructeur d'une classe PHP. Ainsi, votre méthode a agit comme un constructeur pour la classe A.

Renommez votre méthode et cela devrait fonctionner :

class First
{
    private function another() 
    { 
        echo 'a'; 
    }

    public function b() 
    { 
        echo 'b'; 
    }
}

Voir __construct() vs SameAsClassName() pour les constructeurs en PHP

0voto

Davide Perozzi Points 356

"Déclassé : Les méthodes ayant le même nom que leur classe ne seront pas des constructeurs dans une future version de PHP" - Affiche PHP 7 après avoir exécuté le code d'exemple.

Je pense que vous ne pouvez pas nommer la méthode avec le même nom que la classe. Dans les anciennes versions de PHP, vous pouviez définir le constructeur de la classe en nommant la méthode comme la classe. PHP considère que la fonction a est un constructeur. Cela ne fonctionnera donc pas de cette manière.

Comme l'a dit Zac Brown, vous devez utiliser la méthode __construct().

0voto

Haresh Vidja Points 39

Dans la classe A, vous avez défini la méthode a() avec le même nom que la classe. Il s'agit donc de la méthode du constructeur de la classe A. Mais en PHP, vous ne pouvez pas créer de méthode de constructeur privée.

<?php
class A
{
    public function a() 
    { 
        echo 'a'; 
    }

    public function b() 
    { 
        echo 'b'; 
    }

}

class B extends A 
{
    //no extended definition, only what's inherited 
}

$object_B = new B();

echo $object_B->b();

0voto

jonju Points 2473

Voici la clarification :

Vous définissez method a() en Class A . Ils portent le même nom, donc method a() est traité comme constructor de Class A . Par conséquent, au moment où vous initialisez Class B en $object_B = new B(); , vous initialisez Class A également depuis A s'étend B y el constructor est appelée. Parce que Les classes qui ont une méthode de construction appellent cette méthode sur chaque objet nouvellement créé Constructeur PHP . et donc l'erreur.

Je pense que cela clarifie vos doutes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X