2013-04-04 2 views
1

Я определил новую переменную в __construct(), и я хочу использовать ее в другом function этого class. Но моя переменная пуста в другой функции!Использовать переменную из __construct() другими методами

это мой код:

class testObject{ 
    function __construct() { 
      global $c; 
      $data = array("name"=>$c['name'], 
         "family"=>$c['family']); 
    } 

    function showInfo() { 
      global $data; 
      print_r($data); 
    } 

} 
+0

Вы действительно посмотрели: http://uk.php.net/manual/en/language.oop5.php? –

+0

Не ответ, но связанный: http://stackoverflow.com/questions/11923272/use-global-variables-in-a-class/11923384#11923384 – PeeHaa

+0

Использовать свойства класса вместо 'global': http: // www.php.net/manual/en/language.oop5.properties.php Использование 'global' (почти?) никогда не является хорошим решением. – str

ответ

3

Объявите переменную $data как глобальные внутри конструктора:

function __construct() { 
     global $c; 
     global $data; 
     $data = array("name"=>$c['name'], 
        "family"=>$c['family']); 
} 

Тогда будет видно в другой функции, а также.

Отметьте, что настоятельно рекомендуется использовать глобальные переменные, пересмотреть свой класс, чтобы использовать переменные класса с помощью getters + setters.

Более правильный способ будет использовать

class testObject 
{ 
    private $data; 

    function __construct(array $c) 
    { 
     $this->data = array(
      "name"=>$c['name'], 
      "family"=>$c['family'] 
     ); 
    } 

    function showInfo() 
    { 
     print_r($this->data); 
    } 

    // getter: if you need to access data from outside this class 
    function getData() 
    { 
     return $this->data; 
    } 
} 

Кроме того, рассмотреть вопрос разделения полей данных в отдельных переменных класса, как показано ниже. Тогда у вас есть типичный чистый класс данных.

class testObject 
{ 
    private $name; 
    private $family; 

    function __construct($name, $family) 
    { 
     $this->name = $name; 
     $this->family = $family; 
    } 

    function showInfo() 
    { 
     print("name: " . $this->name . ", family: " . $this->family); 
    } 

    // getters 
    function getName() 
    { 
     return $this->name; 
    } 

    function getFamily() 
    { 
     return $this->family; 
    } 

} 

И вы можете даже построить этот объект с данными от вас глобальной переменной $c, пока вы не elimitate его из кода:

new testObject($c['name'], $c['family']) 
+0

спасибо, это работает для меня, это безопасно? – MajAfy

+2

@MajAfy нет, это небезопасно, потому что оно разрушает инкапсуляцию и заставляет ваш класс зависеть от этих переменных, которые должны быть определены и изменены где-то в глобальной области. Это плохая практика. Если классу нужны данные $ c и $, используйте Dependency Injection и сохраните эти значения в качестве свойств объекта. – Gordon

+0

@MajAfy - что вы на самом деле подразумеваете под «безопасным»? Использование глобальных переменных - это всего лишь плохая практика, и ее следует избегать * если возможно *. Я просто объяснил технически, почему переменная была пуста в методе другого класса. –

2

Вы можете сделать этот путь. Вместо объявления $data как global переменная объявляет как public или private или protected переменной внутри класса в зависимости от вашего использования. Затем установите данные внутри _construct.

Использование глобального внутри класса не является хорошим методом. Вы можете использовать свойства класса.

class testObject{ 
    public $data; 

    function __construct() { 
     global $c; 
     $this->data = array("name"=>$c['name'], 
         "family"=>$c['family']); 
    } 

    function showInfo() { 
     print_r($this->data); 
    } 

} 
+0

Почему нижний предел? это правильный метод? – Sabari

+1

Это dovnwoted, потому что вам нужно обвинять ОП в «плохом» знании ООП, а не в понимании;) – Narek

+0

Так в чем же ошибка. Я сказал ему правильный путь – Sabari

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