php - 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;
...
}
...
如果有帮助,上述文件是 CodeCeptionCest
并MyProcessingMethod
用作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;
解决方案
将加载器添加到代码的第一行:
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
推荐阅读
- css - 尝试启用 CSS 模块但显示错误
- mysql - Azure MySQL 服务器允许禁用 'sql_mode=only_full_group_by'
- python - 使用 MultiLabelBinarizer python 解码
- r - 你如何绘制分布在多列上的分布图?
- azure - 使用 ADF 管理 Azure BlobStorage 文件追加
- python - 如何使用 Django 将每个图像嵌入到 HTML 页面的目录中?
- python - 将时间更改为标准日期时间格式
- ruby-on-rails - 在 XHR 响应中发送 cookie 但它没有被存储?
- c# - 在我的应用程序上获取 Windows gmail 通知
- c# - 使用 ASP.NET MVC5 将数据库中的数据导入我的视图中的下拉列表