将 php 网站部署到 heroku 时自动加载器出现问题
Problem with autoloader in deploying php website to heroku
当我的 php 代码部署到 heroku 时,我的自动加载器功能无法正常工作。我正在使用命名空间。
File structure
Heroku log
它在本地主机上工作正常。我已经对从 localhost 到 heroku 的路径进行了必要的更改,因为 heroku 使用 /app 作为文档根目录。因此,在下面的例子中,BASEURL 设置为:
define('BASEURL', $_SERVER['DOCUMENT_ROOT']);
这是初始化文件的一部分:
spl_autoload_register('myAutoLoaderPerson');
function myAutoLoaderPerson($className) {
$path = BASEURL . '/classes/';
$extension = '.class.php';
$fullPath = $path . $className . $extension;
require $fullPath;
}
我做错了什么?
您确定$_SERVER['DOCUMENT_ROOT'])
填写正确吗?
我宁愿建议使用一些相对定义来定义 BASEURL
,例如,如果 Document Root 是定义 BASEURL
的文件上方的两个文件夹:
define('BASEURL', realpath(__DIR__ . "/../../"));
或者简化自动加载器,使其成为相对路径:
spl_autoload_register('myAutoLoaderPerson');
function myAutoLoaderPerson($className) {
require_once __DIR__ . "/../../../classes/$className.class.php";
}
您建议退回 /app/classes/lib\foo.class.php
。
注意 /
和 \
的组合。可能不同之处在于您在 windows locally, but on linux 远程。
如果您遵循 PSR-4 约定,那么这意味着您的命名空间应该与目录匹配,但为了做到这一点,您可能需要将 \
转换为 /
。
可能是这样的:
spl_autoload_register('myAutoLoaderPerson');
function myAutoLoaderPerson($className) {
require_once __DIR__ . "/../<path..to>/classes/" . strtr($classname, "\", "/") . ".class.php";
}
当我的 php 代码部署到 heroku 时,我的自动加载器功能无法正常工作。我正在使用命名空间。
File structure
Heroku log
它在本地主机上工作正常。我已经对从 localhost 到 heroku 的路径进行了必要的更改,因为 heroku 使用 /app 作为文档根目录。因此,在下面的例子中,BASEURL 设置为:
define('BASEURL', $_SERVER['DOCUMENT_ROOT']);
这是初始化文件的一部分:
spl_autoload_register('myAutoLoaderPerson');
function myAutoLoaderPerson($className) {
$path = BASEURL . '/classes/';
$extension = '.class.php';
$fullPath = $path . $className . $extension;
require $fullPath;
}
我做错了什么?
您确定$_SERVER['DOCUMENT_ROOT'])
填写正确吗?
我宁愿建议使用一些相对定义来定义 BASEURL
,例如,如果 Document Root 是定义 BASEURL
的文件上方的两个文件夹:
define('BASEURL', realpath(__DIR__ . "/../../"));
或者简化自动加载器,使其成为相对路径:
spl_autoload_register('myAutoLoaderPerson');
function myAutoLoaderPerson($className) {
require_once __DIR__ . "/../../../classes/$className.class.php";
}
您建议退回 /app/classes/lib\foo.class.php
。
注意 /
和 \
的组合。可能不同之处在于您在 windows locally, but on linux 远程。
如果您遵循 PSR-4 约定,那么这意味着您的命名空间应该与目录匹配,但为了做到这一点,您可能需要将 \
转换为 /
。
可能是这样的:
spl_autoload_register('myAutoLoaderPerson');
function myAutoLoaderPerson($className) {
require_once __DIR__ . "/../<path..to>/classes/" . strtr($classname, "\", "/") . ".class.php";
}