为foreach()提供的参数无效PHP OOP

时间:2016-02-24 19:04:58

标签: php oop

我是PHP的新手,我正在尝试使用面向对象的编程来设置CMS(内容管理系统)。

在重新分解代码以使其更简单的同时,我遇到了一个问题。

当我实例化一个类并使用“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 -->

2 个答案:

答案 0 :(得分:0)

仔细检查此部分:if ($the_object->has_the_attribute($the_attribute))。您应该无法访问&#39; has_the_attribute&#39;来自对象外部的私有函数。

话虽如此,如果您尝试将OOP概念应用于您的项目,您应该首先分类您的课程中的问题。这个Users课显然做了太多事情。它代表一个用户实体(或它们的集合),它充当存储库,也充当工厂。

您应该尝试将这些内容拆分为appart,这样可以更轻松地推理您的代码。一些想法:

  • 用户:此对象代表您称之为用户的内容,并且应将其属性设置为 private ,并仅为其上允许的操作提供访问者方法提供encapsulation。您也可以通过其构造函数提供其必需数据。
  • UserRepository :会提供几种从数据库中检索用户对象的方法(findAll()findById)。您可以从控制器或服务中使用它来从他们所在的任何数据存储中获取用户(在您的情况下,数据库)。
  • UserFactory :此类的职责是从查询返回的数组构造用户对象。它将是UserRepository的依赖项,并且包含以下方法:buildOneFromArray(对于单个DB结果)或buildFromArray(对于许多DB结果)。它可以从存储库中使用。

希望这有帮助

答案 1 :(得分:0)

您忘记将return放在该find_all_users函数上:

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