2016-12-10 3 views
1

Мой класс выглядит так:Присвоить значение свойства, используя анонимную функцию

<?php 

class ExampleClass{ 

    private $example_property = false; 

    public function __construct(){ 
     $this->example_property = function() { 
      $this->example_property = 1; 
      return $this->example_property; 
     }; 
    } 

    public function get_example_property(){ 
     return $this->example_property; 
    } 
} 

$example = new ExampleClass(); 
echo $example->get_example_property(); 

Property $example_property должен быть false, пока вы не вызовете его, а затем, в первый раз это называется, я хочу назначить 1 к нему. Что случилось с моим кодом?

Ошибка: Error Object of class Closure could not be converted to string on line number 20.

+0

Какой язык вы пришли? Что вы на самом деле пытаетесь сделать? – naomik

+0

'$ this-> example_property' уже закрывается, когда' ExampleClass' создает экземпляр, и когда вы получаете его с помощью 'get_example_property', вам нужно сначала его вызвать. – Federkun

+0

Просто добавьте 'if (! $ This-> example_property) {$ this-> example_property = 1}' к функции 'get_example_property'. Я думаю, нет необходимости использовать закрытие. – akrys

ответ

-1

Я просто попытался немного поиграть с вашим кодом.

Чтобы сделать это возможным, вы должны выяснить, является ли переменная функция (определенная в вашем __construct) или число, установленное с помощью этой функции

<?php 

class ExampleClass{ 

    private $example_property = false; 

    public function __construct(){ 
     $this->example_property = function() { 
      $this->example_property = 1; 
      return $this->example_property; 
     }; 
    } 

    public function get_example_property(){ 
     $func = $this->example_property; 
     if(is_object($func) && get_class($func)=='Closure'){ 
      return $func(); 
     } 
     return $func; 
    } 
} 

$example = new ExampleClass(); 
echo $example->get_example_property(); //returning 1 
echo $example->get_example_property(); //returning 1 again 

Но в любом случае, я не см. любой смысл в этом.

Типичным решением было бы что-то вроде этого:

class ExampleClass{ 

    private $example_property = false; 

    public function __construct(){ 
     //usually initializing properties goes here. 
     //$this->example_property = 1; 
    } 

    public function get_example_property(){ 
     // I think you want a value to be initialzed only if needed. 
     // so then it can go here. 
     if(!$this->example_property) { 
      $this->example_property = 1; //initialize it, if needed 
     } 
     return $this->example_property; 
    } 
} 

$example = new ExampleClass(); 
echo $example->get_example_property(); //returning 1 
echo $example->get_example_property(); //returning 1 again 
+0

Спасибо, я буду использовать ваше второе решение, потому что первое решение очень уродливое. –

+0

Это было то, что я пытался выразить в своем первом комментарии ;-) – akrys

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