2010-11-13 24 views
2

En PHP, nous pouvons appeler des fonctions membres statiques en utilisant des objets de classe. Par exempleEn PHP, nous pouvons accéder aux fonctions membres statiques en utilisant des objets de classe. Quelqu'un peut-il s'il vous plaît dire toute utilisation pratique de cette fonctionnalité

class Human 
{ 
    public static function Speak() 
    { 
     echo "I am a human."; 
    } 
} 

$human = new Human(); 
$human->Speak(); 

ce que nous attendons est qu'une fonction membre statique ne peut être appelé en utilisant le nom de classe et non la variable d'instance de classe (objet). Mais ce que j'ai vu pendant la programmation, c'est que php permet d'appeler une fonction membre statique en utilisant aussi l'objet classe. Y at-il une utilisation pratique ou une raison importante que cette fonctionnalité a été fournie en PHP?

Cette fonctionnalité existe aussi dans java et C++. Merci Oli d'avoir signalé cela dans votre réponse.

+1

Probablement pour imiter Java. Cependant, je ne sais pas à quoi cela sert là non plus. – zneak

Répondre

2

Ceci est identique à d'autres langages OO, tels que C++ et Java. Pourquoi voudriez-vous que l'interprète à empêche cela?

MISE À JOUR

Ma meilleure estimation pour cela (ce qui est seulement une estimation) est « pour plus de commodité ». En substance, pourquoi l'utilisateur de votre classe devrait-il nécessairement se préoccuper de savoir si une fonction membre donnée est statique ou non? Dans certaines circonstances, cela aura certainement de l'importance; dans d'autres, peut-être pas. Je ne dis pas que c'est une bonne justification, mais c'est tout ce que je peux trouver!

+0

Fondamentalement, je viens de fond. Net, où j'utilise C# pour mes projets de programmation. Cette chose n'est pas autorisée dans C#. Je suis curieux de savoir qu'il y a une raison particulière pour cette fonctionnalité. Parce que, selon la théorie, la statique n'a rien à voir avec les variables d'instance. Ce sont des choses au niveau de la classe. –

+0

Pourquoi ne pas vouloir quelque chose ne semble pas être une grande justification pour l'être. – zneak

+0

Merci également de souligner que C++ et java fournissent également cette fonctionnalité. j'ai oublié de l'ajouter à ma question. J'ai essayé cela avec Java et je savais que Java fournit cette fonctionnalité. –

0

Je ne peux pas répondre pour PHP, (ou vraiment pour quoi que ce soit), mais considérer cette hypothèse C++:

class base{ 
public: 
    static void speak(){cout<<"base\n";} 
}; 

class sub :public base { 
public: 
    static void speak(){cout<<"sub\n"; } 
}; 

int _tmain(int argc, _TCHAR* argv[]){ 

    base *base1 = new base(); 
    base1->speak(); 

    sub *sub1 = new sub(); 
    sub1->speak(); 

    base *sub2 = new sub(); 
    sub2->speak(); 
    ((sub*)sub2)->speak(); 
} 

La sortie serait:

base 
sub 
base 
sub 

Je suis sûr qu'il pourrait être utile ... peut-être vous aider à déterminer la méthode statique de la classe que vous devriez appeler en fonction de l'objet actuellement en cours.

1

il vous permet de faire abstraction de la définition particulière de la méthode, de sorte que, par exemple, si vous deviez la transformer en statique, vous n'avez pas besoin de réécrire tous les appels de méthode!