2009-10-27 6 views
12

Pourquoi est-il impossible d'initialiser une propriété à une fonction lorsque vous déclarez la propriété dans php? Les résultats de SNIPPIT suivants dans une erreur Parse : erreur de syntaxe, T_FUNCTION inattendueInitialiser la propriété de classe avec une fonction anonyme

<?php 
    class AssignAnonFunction { 
    private $someFunc = function() { 
     echo "Will Not work"; 
    }; 
    } 
?> 

Pourtant, vous pouvez initialiser une propriété à une chaîne, un nombre ou d'autres types de données?

Edit:

Mais je peux assigner une fonction à une propriété dans la méthode __construct(). Ce qui suit fonctionne:

<?php 
    class AssignAnonFunctionInConstructor { 
    private $someFunc; 

    public function __construct() { 
     $this->someFunc = function() { 
     echo "Does Work"; 
     }; 
    } 
    } 
?> 

Répondre

18

Parce qu'il n'est pas implémenté en PHP.

http://www.php.net/manual/en/language.oop5.properties.php. Quote:

They (properties) are defined by using one of the keywords public, protected, or private, followed by a normal variable declaration. This declaration may include an initialization, but this initialization must be a constant value--that is, it must be able to be evaluated at compile time and must not depend on run-time information in order to be evaluated.

Vous ne pouvez pas initialiser des propriétés comme ceci, les fonctions ne sont pas des valeurs constantes. D'où ma réponse originale "elle n'est pas implémentée".

Pourquoi n'est-il pas implémenté? Ce que je ne peux que deviner - c'est probablement une tâche assez complexe et personne ne s'est engagé à le mettre en œuvre. Et/ou il n'y a peut-être pas assez de demande pour une fonctionnalité comme celle-là.

+0

Inutile ou informatif; quel est le contexte de la raison pour laquelle il n'est pas mis en œuvre? – Ophidian

+2

La critique était bien méritée, j'ai changé la réponse pour avoir un peu plus de détails. –

2

Les fermetures n'existent pas en PHP jusqu'à PHP 5.3 (la dernière version). Assurez-vous d'avoir PHP 5.3 si vous voulez faire cela.

Dans les versions précédentes, vous pouvez dupliquer sorte de cette fonctionnalité avec la fonction create_function(), un peu comme ceci:

$someFunc = create_function($args,$code); 
$someFunc(); 

Où $ args est une chaîne formatée comme « $ x, $ y, z $ "et $ code est une chaîne de votre code PHP.

+0

Ceci est dans php 5.3. J'ai mis à jour ma question avec un cas qui fonctionne (je peux assigner une fonction à une propriété dans la méthode magic __construct) –

+0

dans php 5.6 la syntaxe dans l'OP ne fonctionne pas, create_function() n'est pas la même chose –

Questions connexes