2016-07-20 2 views
0

Почему я не могу присвоить значение в свойстве класса, подобное этому? Сначала ошибка я получаю:PHP Назначение каскадных методов в свойстве класса

Parse error: syntax error, unexpected '$this' (T_VARIABLE) in C:\wamp\www\site\people.php on line 8

Код:

<?php 

$person = new People; 
echo $person->getPersonInfo(); 

class People 
{ 
private $person_info = $this->getName . ' ' . $this->getGender . ' and ' . $this->getAge() . '.'; 
private $person = array(
'name' => 'Sarah', 
'gender' => 'female', 
'age' => 21 
); 

public function __construct() 
{ 
    echo 'Class is created.' . '<br>'; 
} 

public function getName() 
{ 
    return $this->person['name']; 
} 

public function getGender() 
{ 
    return $this->person['gender']; 
} 

public function getAge() 
{ 
    return $this->person['age']; 
} 

public function getPersonInfo() 
{ 
    return $this->person_info; 
} 
} 
+1

Поскольку http://php.net/manual/en/ language.oop5.properties.php _This декларация может включать в себя инициализацию, но эта инициализация должна быть постоянным значением, то есть она должна быть способна быть оценена во время компиляции и не должна зависеть от информации о времени выполнения, чтобы быть Оцените._ ** Постройте его в конструкторе. ** – AbraCadaver

ответ

0

Вы не можете установить динамические значения в свойствах класса, как это; они должны быть постоянными значениями. Вы должны сделать такие назначения в конструкторе

// NO 
private $person_info = $this->getName . ' ' . $this->getGender . ' and ' . $this->getAge() . '.'; 

// YES 
public function __construct() { 
    $this->person_info = $this->getName . ' ' . $this->getGender . ' and ' . $this->getAge() . '.'; 
} 

Но то, что вы на самом деле означает это

// you're calling get methods, not properties 
// make sure to use $this->getName(), not $this->getName 
public function __construct() { 
    $this->person_info = $this->getName() . ' ' . $this->getGender() . ' and ' . $this->getAge() . '.'; 
} 

Но на самом деле весь код плохо

// This makes no sense to have as a constant property in a class 
private $person = array(
    'name' => 'Sarah', 
    'gender' => 'female', 
    'age' => 21 
); 

Этот класс делает намного больше смысл для ваших целей

class Person { 

    // container for your info object 
    private $info = []; 

    // make info a parameter for your constructor 
    public function __construct(array $info = []) { 
    $this->info = $info; 
    } 

    // use PHP magic method __get to fetch values from info array 
    public function __get(string $attr) { 
    return array_key_exists($attr, $this->info) 
     ? $this->info[$attr] 
     : null; 
    } 

    // use PHP magic method __set to set values in the info array 
    public function __set(string $attr, $value) { 
    $this->info[$attr] = $value; 
    } 

    // single method to fetch the entire info object 
    public function getInfo() { 
    return $this->info; 
    } 
} 

Простой. Давайте посмотрим, как это работает сейчас

$p = new Person([ 
    'name' => 'Sarah', 
    'gender' => 'female', 
    'age' => 21 
]); 

echo $p->name, PHP_EOL; 
// Sarah 

echo $p->gender, PHP_EOL; 
// female 

echo $p->age, PHP_EOL; 
// 21 

echo json_encode($p->getInfo()), PHP_EOL; 
// {"name":"Sarah","gender":"female","age":21} 

Поскольку $info массив является параметром теперь, вы можете легко создавать объекты Person с другими данными

$q = new Person([ 
    'name' => 'Joey', 
    'gender' => 'male', 
    'age' => 15 
]); 

echo $q->name, PHP_EOL; 
// Joey 

echo $q->gender, PHP_EOL; 
// male 

echo $q->age, PHP_EOL; 
// 15 

echo json_encode($q->getInfo()), PHP_EOL; 
// {"name":"Joey","gender":"male","age":15} 
+1

Я очень ценю все новые знания. Будет намного больше, чтобы узнать сейчас, так что спасибо. Вернемся к теме, в комментарии в ней говорится: «Это объявление может включать инициализацию, но эта инициализация должна быть постоянным значением, то есть она должна быть способна быть оценена во время компиляции и не должна зависеть от запуска, чтобы получить оценку ». Это слишком много английского для меня прямо сейчас. – Joey

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