首页 > 解决方案 > PHP中的动态类使用

问题描述

我正在编写一个处理城市地理坐标的程序,我想在每次运行中随机选择我的城市;所有城市的流程都是一样的。

我为每个城市都有一个 PHP 类,其中包含它的地理坐标;例如:

<?php
namespace Utility\Locations;
class Tehran
{
    const MIN_LAT = 35.325;
    const MAX_LAT = 35.390;
    const MIN_LNG = 51.165;
    const MAX_LNG = 51.230;
}

在另一个 PHP 文件中,我将该类用作:

use Utility\Locations\Tehran;
use Utility\Locations\Karaj;
...
protected function MyProcessingMethod () {
    ...
    $city =  Faker::create()->randomElement(array("Tehran", "Karaj"));
    echo $city::MIN_LAT;
    ...
}
...

如果有帮助,上述文件是 CodeCeptionCestMyProcessingMethod用作DataProvider. 当我使用 运行测试时codecept run scenarios/MyCest.php,我收到此错误:

PHP Fatal error:  Uncaught Error: Class 'Tehran' not found in /home/zeinab/PhpstormProjects/test/scenarios/MyCest.php:190
Stack trace:
#0 [internal function]: MyCest->MyProcessingMethod()
#1 /home/zeinab/PhpstormProjects/test/vendor/codeception/codeception/src/Codeception/Util/ReflectionHelper.php(47): ReflectionMethod->invokeArgs(Object(MyCest), Array)
#2 /home/zeinab/PhpstormProjects/test/vendor/codeception/codeception/src/Codeception/Test/Loader/Cest.php(65): Codeception\Util\ReflectionHelper::invokePrivateMethod(Object(MyCest), Object(ReflectionMethod))
#3 /home/zeinab/PhpstormProjects/test/vendor/codeception/codeception/src/Codeception/Test/Loader.php(109): Codeception\Test\Loader\Cest->loadTests('/home/zeinab/Ph...')
#4 /home/zeinab/PhpstormPro in /home/zeinab/PhpstormProjects/test/scenarios/MyCest.php on line 190

我已经阅读了关于这种用法的 PHP 官方文档,但是那里的所有示例都使用了在目标文件中定义的类。

我也试过这个:

$city =  Faker::create()->randomElement(array(Tehran::class, Karaj::class));
echo $city::MIN_LAT;

但我得到了同样的错误。

反正有做我想做的事吗?

编辑 1: 我已将类的路径放在我的psr-4标记中composer.json

"autoload": {
    "psr-4": {
        "Utility\\": "Utility/"
    }
}

加载类似乎没有问题,因为直接使用它们可以正常工作。例如下面的代码做得很好:

echo Tehran::MIN_LAT;

标签: phpclasscodeception

解决方案


将加载器添加到代码的第一行:

function loader($className)
{
    $fileName = str_replace('\\', '/', $className) . '.php';
    require_once $fileName;
}
spl_autoload_register('loader');

然后使用目录结构之类的名称空间:

app/core/city 目录中的 Ahvaz.php

namespace app\core\city;
class Ahvaz
{
//...
}

当你像这样加载一个类Ahvaz.php

$var = new Ahvaz();

你需要添加use app\core\city;

那么你有:

use app\core\city;
$var = new Ahvaz();

它将包括来自 app/core/city 目录的 Ahvaz.php


推荐阅读