Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为foreach()PHP OOP提供的参数无效_Php_Oop - Fatal编程技术网

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

为foreach()PHP OOP提供的参数无效,php,oop,Php,Oop,我是PHP新手,我正在尝试使用面向对象编程建立一个CMS(内容管理系统) 在重新分解代码以使其更简单时,我遇到了一个问题 当我实例化一个类并使用“auto “实例化”,我的数组不再工作,返回为空 如果我使用长表单,它会返回一个数组,但是当我开发一个真正的站点时,以这种方式编写代码将非常耗时 有点失落,任何帮助都将不胜感激。谢谢 users.php: <?php class User { public $id; public $username; public $

我是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 -->

管理
副标题
  • 空白页

  • 再次检查此部分:
    如果(\u对象->具有\u属性(\u属性))
    。您不能从对象外部访问“has_the_attribute”私有函数

    话虽如此,如果您试图将OOP概念应用到项目中,您应该从分离类中的关注点开始。这个
    用户
    类显然做了太多的事情。它代表一个用户实体(或它们的集合),它充当存储库和工厂

    你应该试着把这些东西分开,这会使你的代码更容易推理。一些想法:

    • User:此对象将表示您所称的用户,其属性应为私有,并且仅为允许在其上提供
      封装的操作提供访问器方法。您也可以通过它的构造函数提供它的强制数据
    • UserRepository:将提供两种方法从数据库检索用户对象(
      findAll()
      findById
      )。您可以从控制器或服务中使用它从用户所在的数据存储(在您的情况下是数据库)中获取用户
    • UserFactory:此类的职责是从查询返回的数组中构造用户对象。它将是用户存储库的一个依赖项,并将包含如下方法:
      buildOneFromArray
      (对于单个数据库结果)或
      buildFromArray
      (对于许多数据库结果)。它将从存储库中使用

    希望这对您有所帮助

    您忘记将
    返回
    放在
    查找所有用户
    功能上:

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

    错误到底发生在哪里?
    $users
    的值是多少?这里有几个
    foreach
    循环?失败的具体原因是什么?发生这种情况时的运行时值是什么?所有注释都会导致“auto”类的生成。也就是说,我以前做过这些测试。当我检查“用户”是否是数组时,它返回为空,我不明白为什么。当我在没有if语句的情况下运行它时,它会作为一个无效参数返回。例如,
    User::find_all_users
    不会
    返回任何内容。顺便问一下-你通常如何处理更新对象-创建一个新类进行更新?我不太确定你所说的“更新”是什么意思。如果您引用的是该模型,那么如果您的类已经提供了该功能(即User->changeAddress(Address$Address)),则可能不需要该模型。您可能需要一个特定的服务来协调模型中更大的更改。如果你指的是数据存储,你也可以使用你的存储库(UserRepository->store($user))。例如,如果我有一个有很多图像的项目模型。如果我以后决定删除一些图像并添加新图像,调用哪个类方法会更好?我应该打电话给存储库吗?