2015-03-03 1 views
3

Взгляните на этот код, пожалуйста:Функция буквальным в PHP класс

$array = array(
    'action' => function() { echo "this works"; } 
); 

class Test { 
    public $array = array(
     "action" => function() { echo "this doesn't"; } 
    ); 
} 

Первая функция буквальное разбирает хорошо, но второй - один внутри класса - вызывает синтаксическую ошибку:

Parse error: syntax error, unexpected 'function' (T_FUNCTION)...

Может ли кто-нибудь объяснить это мне? Это ошибка?

EDIT: Это последняя PHP: 5.6.6

+0

Какая версия PHP это именно так? –

+2

Объявления свойств могут быть только константами/литералами. Анонимные функции - это выражения. – mario

+1

Используйте конструктор, и он будет работать, вы не можете назначить переменные класса с не-литералами при создании экземпляра. Они должны быть установлены в конструкторе. – naththedeveloper

ответ

7

Из класса это свойство!

Правило из свойств:

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.

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

+0

Да. Кажется, я должен был прочитать документы более подробно :(Все еще ... это раздражает. Но спасибо! –

+3

Это правильный ответ, но их формулировка неоднозначна: как именно 'function() {echo" this does not "; } '' зависит от информации о времени выполнения?? – georg

+1

@georg. Это еще один вопрос. –

0

Попробуйте это так, дайте мне знать, если это работает для вас

<?php 
$array = array('action' => function() { echo "this works"; }); 
class Test { 
    public $arr; 
    function __construct() { 
     $this->arr = array("action" => function() { echo "this works too"; }); 
    } 
    function getArr(){ 
     var_dump($this->arr); 
    } 
} 

var_dump($array); 
$obj = new Test(); 
$obj->getArr(); 
+1

Спасибо, это сработает, но это не делает мой код более удобным для чтения. Вероятно, я удалю данные в глобальное пространство имен Если PHP-ООП хочет быть капризным, я тоже могу. –

4

Я не имею возможности проверить свой код на PHP 5.6.6, но я думаю, что этот код разрешает вашу проблему.

class Test{ 

    public $array; 

    function __construct(){ 

      $this -> array = array(

       'action' => function(){ 

        echo 'It works too'; 
       } 
      ); 
    } 
} 

$test = new Test(); 
$test -> array['action'](); 

 Смежные вопросы

  • Нет связанных вопросов^_^