2011-05-03 1 views
3
class me { 
    private $name; 
    public function __construct($name) { $this->name = $name; } 
    public function work() { 
     return "You are working as ". $this->name; 
    } 
    public static function work() { 
     return "You are working anonymously"; 
    } 
} 

$new = new me(); 
me::work(); 

Erreur fatale: ne peut pas me redéclarer :: travail()redéclaration de l'instance et la fonction statique

la question est, pourquoi php ne permet pas redéclaration comme ça. Y a-t-il une solution de contournement?

+4

Oui, il existe une solution de contournement: utilisez un autre nom. ;-) PHP n'est pas en C++, les méthodes sont uniques par leurs noms, et non par leur combinaison nom/arguments/visibilité. Même alors, vous ne pouvez pas surcharger une méthode d'objet à une méthode statique en C++ non plus. – netcoder

+0

Est-ce que n'importe quelle langue le permet? Je sais que C# ne fonctionne pas - http://stackoverflow.com/questions/160118/static-and-instance-methods-with-the-same-name – Phil

+0

mais il est bon d'utiliser le même nom pour faire la même chose n'est-ce pas? –

Répondre

7

Il est en fait une solution de contournement pour cela en utilisant la création de méthode magique, bien que je le plus probable jamais faire quelque chose comme ça dans la production code:

__call est déclenché en interne lorsqu'une méthode inaccessible est appelée dans la portée de l'objet.

__callStatic est déclenché en interne lorsqu'une méthode inaccessible est appelée dans une étendue statique.

<?php 

class Test 
{ 
    public function __call($name, $args) 
    { 
     echo 'called '.$name.' in object context\n'; 
    } 

    public static function __callStatic($name, $args) 
    { 
     echo 'called '.$name.' in static context\n'; 
    } 
} 

$o = new Test; 
$o->doThis('object'); 

Test::doThis('static'); 

?> 
+0

Dieu! c'est ce que je cherche, merci: D –

+0

@rizky: pas de soucis :) –

+1

aniway, y at-il une raison pourquoi ne pas utiliser cela dans la production? –

-3

Voici comment je pense que vous devriez le faire à la place:

class me { 
    private $name; 

    public function __construct($name = null) { 
     $this->name = $name; 
    } 

    public function work() { 
     if ($this->name === null) { 
      return "You are working anonymously"; 
     } 
     return "You are working as ". $this->name; 
    } 
} 

$me = new me(); 
$me->work(); // anonymous 

$me = new me('foo'); 
$me->work(); // foo 
+1

Le "anonyme" n'est pas statique. – Malfist

+0

@Malfist: Il n'a jamais prétendu être. C'est une solution alternative. Lisez la réponse correctement la prochaine fois. Les méthodes statiques devraient être évitées autant que possible, et le cas d'utilisation du PO n'est pas celui où une méthode statique est justifiée. – netcoder

+0

Pourquoi les fonctions statiques devraient-elles être évitées autant que possible? Il y a de bonnes raisons pour les fonctions statiques, plus la réduction de la complexité en réduisant la portée. Les fonctions statiques sont une bonne programmation. Cela étant dit, le cas d'utilisation d'OP n'était pas un cas où l'état statique était justifié, je suis d'accord, mais il peut s'agir simplement d'un échantillon que le PO a inventé pour montrer le comportement qu'il veut. – Malfist

Questions connexes