PhP foreach через экземпляры классов - PullRequest
0 голосов
/ 31 октября 2018

Мне интересно об этой странной вещи:

public function getAllCustomers()
{
    $customers = $this->redis->keys("customer:*");
    foreach ($customers as $value) {
        return new \Customer($this->redis->hget($value,"name"),$this->redis->hget($value,"id"),$this->redis->hget($value,"email"));
    }
}

Этот метод возвращает всех клиентов из моей базы данных.

Но если я попытаюсь перебрать всех этих клиентов:

foreach ($customerController->getAllCustomers() as $customer) {
    var_dump($customer);
}

Метод getName() не найден. var_dump возвращает:

NULL
NULL
NULL

Класс клиента:

class Customer {
    var $name;
    var $id;
    var $email;

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

     /**
     * @return mixed
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return mixed
    */
    public function getEmail()
    {
        return $this->email;
    }

    public function __toString()
    {
       return "";
    }
}

Я довольно новичок в PHP и не понимаю, почему я не могу получить доступ к полю объекта Customer.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Решение:

public function getAllCustomers()
{
    $customers = $this->redis->keys("customer:*");
    $custumersArray = array();
    foreach ($customers as $value) {
        $custumersArray[] = \Customer($this->redis->hget($value,"name"),$this->redis->hget($value,"email"),$this->redis->hget($value,"id"));
    }
    return $custumersArray;
}

проблема была в том, что вы возвращаете один массив, но не список массивов.

0 голосов
/ 31 октября 2018

Ваша проблема : вы не возвращаете массив клиентов, а только один. Вы получаете нулевое значение, потому что ваша функция возвращает только 1 object -> и в PHP, при использовании цикла foreach на объекте вы получаете его поля ->, а поля not имеют getName функция.

Решение : инициализировать массив клиентов, заполнить его и вернуться из функции.

 public function getAllCustomers()
{
    $customers = $this->redis->keys("customer:*");
    $customersObjs = array();
    foreach ($customers as $value) {
        $customersObjs[] = new Customer($this->redis->hget($value,"name"),$this->redis->hget($value,"id"),$this->redis->hget($value,"email")));
    }
    return $customersObjs;
}

Теперь у вас есть массив customersObjs, с которым вы можете зацикливаться:

foreach ($customerController->getAllCustomers() as $customer) {
    echo $customer->getName();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...