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
寻找处理/接近PHP OOP网站的方法_Php_Oop - Fatal编程技术网

寻找处理/接近PHP OOP网站的方法

寻找处理/接近PHP OOP网站的方法,php,oop,Php,Oop,我对PHP或编程一点也不陌生。但最近我在考虑用PHP进行网站编程,以及在OOP之前它是多么容易。无论如何,我更喜欢OOP而不是旧的过程风格。 我想实现一个网站,但似乎我总是要使用全局变量或静态变量。我开始想,没有这些我怎么能做到呢 不管怎样,我所说的是为网站的每个“组件”设置一个类。 例如,如果它是一个url较短的网站,它将是:链接、成员、数据库 我说的要复杂得多,至少有8节课。 无论如何,我目前的做法如下: $database = new Database(...); $links = new

我对PHP或编程一点也不陌生。但最近我在考虑用PHP进行网站编程,以及在OOP之前它是多么容易。无论如何,我更喜欢OOP而不是旧的过程风格。 我想实现一个网站,但似乎我总是要使用全局变量或静态变量。我开始想,没有这些我怎么能做到呢

不管怎样,我所说的是为网站的每个“组件”设置一个类。 例如,如果它是一个url较短的网站,它将是:链接、成员、数据库

我说的要复杂得多,至少有8节课。 无论如何,我目前的做法如下:

$database = new Database(...);
$links = new Links($db);
$users = new Users($db);
无论如何,例如,我想获得一个用户通过其ID发布的所有链接,我需要使用两个链接和两个用户组件


我还有别的办法吗?还有别的办法吗?除了将它们作为构造函数参数传递之外。

您可以在PHP中使用自动加载来获得更好的解决方案:


您应该具有以下组件:

  • Business objects,用于建模和表达应用程序中的一个特定“事物”:

    class Link { ... }
    class User { ... }
    
    这些并没有“做”任何事情,它们只是为了使您的数据结构正式化。这些对象具有getter和setter方法来获取和设置各个属性,这些属性也在那里得到验证:

    public function setUrl($url) {
        if (!/* validate the URL here*/) {
            throw new InvalidArgumentException("$url is not a valid URL");
        }
        $this->url = $url;
    }
    
    所需的最低数据是构造函数的一部分。这确保了应用程序范围内的数据完整性。它允许您断言,当您有一个
    Link
    实例时,它表示的数据是链接的最小有效数据

  • 数据库链接。只有连接到数据库所必需的东西,没有更多,也没有更少。一个原始的
    PDO
    mysqli
    对象就可以了

  • 数据对象映射器,它获取数据库链接并知道如何在数据库中存储业务对象以及如何检索业务对象:

    class LinkStorage {
    
        protected $db;
    
        public function __construct(PDO $db) {
            $this->db = $db;
        }
    
    }
    
    该类提供了从数据库检索内容的各种方法:

    public function getById($id) {
        $stmt = $this->db->prepare('SELECT ... FROM ... WHERE id = :id');
        $stmt->execute(compact('id'));
    
        if (!$data = $stmt->fetch()) {
            throw new RuntimeException("Record with id $id does not exist");
        }
    
        return new Link($data['url']);
    }
    
    您可以通过这种方式封装各种不同的查询,例如:

    /**
     * Returns all links by a particular user.
     * @param User $user
     * @return Link[]
     */
    public function getAllFromUser(User $user) {
        ...
    }
    
  • 用法很简单:

    $db          = new PDO(...);
    $linkStorage = new LinkStorage($db);
    $userStorage = new UserStorage($db);
    
    $user  = $userStorage->getById($id);
    $links = $linkStorage->getAllFromUser($user);
    
    这种代码将被封装在一个服务类中,该类包含您可以在应用程序中执行的所有可能的“操作”
    registerUser(array$data)
    getLinksOfUser($id)
    newLinkFromPostData(array$data)

    我刚才描述的基本上是MVC风格应用程序的模型部分。其他两部分是调用服务方法的控制器和输出从服务方法检索的数据的视图。这种方法保持职责的分离和隔离,并允许您像构建块一样将更高级别的逻辑和功能放在一起。业务对象是最底层的构建块,它们的结构需要坚固且定义良好,以便其余部分工作。数据对象映射程序只关心将这些对象放入数据库并再次将其取出。然后,服务将所有这些以各种复杂的方式组合在一起,使事情发生

    您不应该对此有任何循环依赖关系,因为职责是完全分开的。您的个人依赖关系可能仍然有些复杂。如果实例化类变得太麻烦,您需要查看工厂:

    $factory = new Factory;
    $userStorage = $factory->newUserStorage();
    
    实例化的所有复杂性都封装在这个工厂中。更进一步的一步是依赖注入容器,您可以在XML文件中对其进行配置,以指定哪个类取决于什么,然后DI容器将为您处理它

    我在想用PHP进行网站编程是多么简单 在OOP之前

    好吧,那就坚持程序吧。如果以程序性或功能性的方式编写一个写得好的网站更容易,那么与面向OJBEC的方式相反。坚持你所习惯的。OO并不比功能更好。这只是一种不同的方法

    php中的public void main() 在Language Java中,我们编写的每个软件都有一个入口点。
    public void main()
    方法。此方法启动整个应用程序,并传入启动时提供的参数。它也是应用程序中唯一的退出点。应用程序以该方法结束(除非崩溃)

    在php中,没有单一的入口点。我们有一堆文件,它们运行一些脚本来做更多的事情,然后在某个地方另一个脚本决定返回一些东西并死亡()

    依赖注入和IoC库如何提供帮助 在使用依赖项注入时,当创建对象并传递正确的类实例时,在a$$中会遇到真正的麻烦。我们开始用丑陋的解决方案来解决这个问题:单态、全局、静态。。。使我们的软件耦合越来越紧密,维护也越来越困难


    控制反转在这方面会有所帮助。在webz上有一些非常棒的网站。

    我认为这样也可以。如果您这样使用它,有什么困扰您?如果您不想将它们作为构造函数参数传递,您只需在class Link的所需函数中声明一个User类型的对象。然后使用那里的用户对象。虽然有很多类,比如说8,但我需要总是按照特定的顺序设置它们,例如,用户可以进入链接,但在那之后,我想在用户中使用链接,这真的是毁灭性的。(希望你能理解)是的,我明白你的意思。我也是这样做的。这也让我感到沮丧。但是我认为,除了顺序,技术上没有什么可担心的。如果我创建一个数组并在他内部创建所有这些对象,然后将数组传递到每个对象中,有可能吗?PHP确实有一个单一的入口点:您执行的文件中的第一行。从这里开始,它只是包含和自动加载,与Java没有太大区别。实际上,它是用户要求的文件的第一行