2016-02-24 2 views
-1

Я новичок в PHP, и я пытаюсь настроить CMS (систему управления контентом) с помощью объектно-ориентированного программирования.Недопустимый аргумент для foreach() PHP OOP

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

Когда я создаю экземпляр класса и вызываю функцию с помощью «auto экземпляра», мой массив больше не работает и возвращается пустым.

Если я использую длинную форму, она возвращается с массивом, но по мере того, как я разрабатываю настоящий сайт, это займет очень много времени, чтобы закодировать этот путь.

Вид утраты, любая помощь будет принята с благодарностью.

users.php:

<?php 

class User 
{ 

    public $id; 
    public $username; 
    public $password; 
    public $first_name; 
    public $last_name; 

    public static function find_all_users() 
    { 
     self::find_this_query("SELECT * FROM users"); 
    } 

    public static function find_user_by_id($user_id) 
    { 
     global $database; 
     $result_set = self::find_this_query("SELECT * FROM users WHERE id=$user_id LIMIT 1"); 
     $found_user = mysqli_fetch_array($result_set); 

     return $found_user; 
    } 

    public static function find_this_query($sql) 
    { 
     global $database; 
     $result_set = $database->query($sql); 
     $the_object_array = array(); 
     while ($row = mysqli_fetch_array($result_set)) { 
      $the_object_array[] = self::instantation($row); 
     } 

     return $the_object_array; 
    } 

    public static function instantation($the_record) 
    { 
     $the_object = new self; 
//Long form instantation 
     // $the_object->id  = $found_user['id']; 
     // $the_object->username = $found_user['username']; 
     // $the_object->password = $found_user['password']; 
     // $the_object->first_name = $found_user['first_name']; 
     // $the_object->last_name = $found_user['last_name']; 
//Auto instantation 
     foreach ($the_record as $the_attribute => $value) { 
      if ($the_object->has_the_attribute($the_attribute)) { 
       $the_object->$the_attribute = $value; 
      } 
     } 
     return $the_object; 

    } 

    private function has_the_attribute($the_attribute) 
    { 
     $object_properties = get_object_vars($this); 
     return array_key_exists($the_attribute, $object_properties); 
    } 
} 
//Problem is in the function??? 

?> 

admin_content.php:

<div class="container-fluid"> 
<!-- Page Heading --> 
<div class="row"> 
    <div class="col-lg-12"> 
     <h1 class="page-header"> 
      ADMIN 
      <small>Subheading</small> 
     </h1> 

     <?php 
      $users = User::find_all_users(); 

      if(is_object($users)) { 
       foreach ($users as $user => $value) { 
        echo $user->username; 
       } 
      } else { 
       echo "not working"; 
      } 
     ?> 
     <ol class="breadcrumb"> 
      <li> 
       <i class="fa fa-dashboard"></i> <a href="index.html">Dashboard</a> 
      </li> 
      <li class="active"> 
       <i class="fa fa-file"></i> Blank Page 
      </li> 
     </ol> 
    </div> 
</div> 
<!-- /.row --> 

+0

Где ошибка происходит именно? Какова ценность '$ users'? –

+0

Здесь есть пара петель 'foreach'? Что конкретно не удается, и каковы значения времени выполнения, когда это происходит? – David

+0

Все комментарии приводят к созданию класса «auto». Смысл, я это были предыдущие тесты. –

ответ

0

Двойная проверка эта часть: if ($the_object->has_the_attribute($the_attribute)). Вы не должны иметь доступ к частной функции «has_the_attribute» извне объекта.

Сказав, что если вы пытаетесь применить концепции ООП к своему проекту, вы должны начать с разделения проблем в своих классах. Класс Users явно делает слишком много вещей. Он представляет объект пользователя (или его коллекцию), он действует как репозиторий, а также как фабрика.

Вы должны попытаться разделить эти вещи appart, что значительно упростит ваш код. Некоторые идеи:

  • пользователя: Этот объект будет представлять то, что вы называете пользователь, и должны иметь свои свойства, как частных и содержат только методы аксессоров для тех операций, которые разрешены на нем, чтобы обеспечить encapsulation. Вы также можете предоставить свои обязательные данные через свой конструктор.
  • UserRepository: Предоставил бы несколько методов для извлечения пользовательских объектов из вашей базы данных (findAll() и findById). Вы будете использовать это из своих контроллеров или служб для извлечения пользователей из того хранилища данных, в котором они находятся (в вашем случае, базы данных).
  • UserFactory: Ответственность этого класса заключается в создании пользовательских объектов из массивов, возвращенных из вашего запроса. Это будет зависимость вашего UserRepository и будет содержать такие методы, как: buildOneFromArray (для одного результата DB) или buildFromArray (для многих результатов DB). Он будет использоваться из репозитория.

Надеется, что это помогает

+0

Кстати - как вы обычно справляетесь с обновлением объектов? Создайте новый класс для обновления? – naneri

+0

Я не совсем понимаю, что вы подразумеваете под «обновлением». Если вы ссылаетесь на модель, она может не понадобиться, если ваш класс предоставляет уже функциональность (то есть User-> changeAddress (Address $ address)). Возможно, вам понадобится конкретный сервис, который координирует большие изменения в вашей модели. Если вы обращаетесь к хранилищу данных, вы также можете использовать свой репозиторий (UserRepository-> store ($ user)). – hasumedic

+0

Я имею в виду для instanse, если у меня есть модель Item, у которой много изображений. Если позже я решу удалить некоторые изображения и добавить новые изображения, какой метод класса лучше будет вызывать? Должен ли я вызвать репозиторий? – naneri

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