1

对不起,冗长的解释......我喜欢彻底。

我对 OOP PHP 很陌生(到目前为止大约花了一周的时间编写代码),但我已经掌握得很好,我真的很喜欢它!我已将所有类放入一个 GIANT 包含文件中,并将其包含在需要存储在SESSION. 然后今天我意识到这很难导航,每个页面都在加载每个类,即使它没有使用它,所以当我在某个地方读到最好将类分解成它们自己的文件时,我把它们全部放在他们的在 lib 文件夹中拥有自己的文件。

学生类进入 student.php 文件。员工类进入了staff.php 文件。等等等等

这是我感到困惑的地方......我编写了一些工厂来从数据库中查找某些信息。这些工厂工作得很好!我传递了类型(例如 ID、用户名、资产),工厂返回适当的查找,然后可以将其传递给标准。

这是我为一家工厂所做的一个例子。文件名为 devicelookup.php

<?php
// Device Lookup

/*
 *  device lookup interface.  This ensures that each lookup provider has the same function
 */
interface deviceLookupProvider {
    public function lookupDevice($arg);
}

/*
 *  class assetLookupDevice
 */
class assetLookupDevice implements deviceLookupProvider {
    public function lookupDevice($arg) {
        global $mysqli;
        $asset = $mysqli->real_escape_string($arg);
        $sql = "SELECT computer.* FROM `computer` WHERE computer.assetTag = '" . $asset . "' LIMIT 1;";
        $result = $mysqli->query($sql) or die($mysqli->error);
        if ($result->num_rows > 0) {
            return $result->fetch_assoc();
        } else {
            return null;
        }
    }
}

/*
 *  device lookup factory.  This returns a lookup object based off the type.
 */
class DeviceLookupFactory {
    public static function createDeviceLookup($type) {
        switch ($type) {
            case "asset":
                return new assetLookupDevice;
                break;
        }
    }
}

我正在尝试使用 php.net 上的代码来实现 spl_autoloader,如下所示:

function my_autoloader($class) {
    include 'lib/' . $class . '.php';
}

spl_autoload_register('my_autoloader');

这种功能对学生、员工、工作流和其他与他们的文件同名的类非常有用,但我对拆分工厂及其实现到/lib中自己的文件感到奇怪。

如果我必须进行这种拆分,那么我希望将它们分组到自己的文件夹或其他东西中,然后我会遇到命名空间。我有点理解将命名空间放在单个类上的概念......但我不明白。

而且,如果我找出命名空间的最佳结构,那么我应该能够调用

<?php
spl_autoload_extensions(".php"); // comma-separated list
spl_autoload_register();
?>

只是神奇地包含所有需要的类文件。

那么......如何构建这个环境?我想正确地构造所有内容,以便将来可以将对象编码重用于不是 OOP 的更大应用程序。

4

1 回答 1

2

IMO,当涉及到类命名和文件层次结构时,您应该遵守 PSR-0(请参阅完整规范)。然后,您可以使用符合 PSR-0 的自动加载器并避免编写自己的.

至少,每个类、接口、特征都应该在其自己的文件中,其名称与类/接口/特征名称完全相同。

于 2013-03-05T16:19:31.890 回答