6
votes

PHP: Comment $ peut-il cette variable à l'intérieur d'une classe être un objet d'un autre?

Voici un exemple:

class Test {

    public function TestMethod() {

        print_r($this); // Gives me "Test1 Object ( )"

    }
}

class Test1 {

    public function Test1Method() {

        Test::TestMethod();

    }
}

$test1 = new Test1;
$test1->Test1Method();


1 commentaires

J'ai demandé une question très similaire (pas une dupe). Les réponses ont été très utiles Stackoverflow.com/questions/516355/...


3 Réponses :


4
votes

Réponse courte: Vous appelez une méthode "non statique" à l'aide d'un appel de fonction statique, PHP essaie ensuite de trouver un "$ ceci" et le dernier véritable "$ ceci" était celui à Test1.

Si vous activez E_Strict Error Reporting, il se plaint.


0 commentaires

7
votes

de http://www.php.net/manual/fr /language.oop5.basic.php :

Le pseudo-variable $ CU est disponible Quand une méthode est appelée à partir d'un contexte d'objet. $ CU est une référence à l'objet d'appel (généralement le objet auquel appartient la méthode, mais éventuellement un autre objet, si le la méthode est appelée statiquement de la contexte d'un objet secondaire).

Cela ne fait pas nécessairement beaucoup de sens, cependant, et invoquera un avertissement si e_truct est activé.


3 commentaires

Il serait logique si test1 était une sous-classe de test ; Peut-être que c'est juste un moyen peu coûteux de recréer le comportement trouvé dans les langues conçues pour OOP du début.


Quelle est la meilleure façon de vérifier si $ CU références à la classe actuelle? J'en ai besoin pour vérifier si la méthode s'appelait staticly ou de l'objet. Je suppose que c'est quelque chose comme si ($ cette instance de __class__) {} . Ai-je raison?


@Saltlake: Je ne sais pas. Mais personnellement, j'ajuste e_strict pour empêcher ce type de piratage! Cela ne peut que conduire à la douleur à long terme.



0
votes

est reliure statique tardive si je Je ne me trompe pas, ce qui pourrait être aussi fin vendredi.


0 commentaires