对不起,冗长的解释......我喜欢彻底。
我对 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 的更大应用程序。