如何在不使用 require_once 的情况下自动加载和调用独立的 PHP class?
How to autoload and call an independent PHP class without using require_once?
我有一个名为 EQ
的主 class,连接到其他 classes,可以在这个 GitHub link.
中查看
EQ class 未连接到我的 composer,我在本地服务器中调用它使用:
php -f path/to/EQ.php
和使用 CRON 作业的实时服务器:
1,15,30,45 * * * * (sleep 12; /usr/bin/php -q /path/to/EQ.php >/dev/null 2>&1)
我不确定如何正确使用自动加载器并将所有相关文件加载到此 class,并删除 require_once
s。我已经尝试过了,它似乎确实有效:
spl_autoload_register(array('EQ', 'autoload'));
如何解决这个问题?
尝试
//Creates a JSON for all equities // iextrading API
require_once __DIR__ . "/EquityRecords.php";
// Gets data from sectors // iextrading API
require_once __DIR__ . "/SectorMovers.php";
// Basic Statistical Methods
require_once __DIR__ . "/ST.php";
// HTML view PHP
require_once __DIR__ . "/BuildHTMLstringForEQ.php";
// Chart calculations
require_once __DIR__ . "/ChartEQ.php";
// Helper methods
require_once __DIR__ . "/HelperEQ.php";
if (EQ::isLocalServer()) {
error_reporting(E_ALL);
} else {
error_reporting(0);
}
/**
* This is the main method of this class.
* Collects/Processes/Writes on ~8K-10K MD files (meta tags and HTML) for equities extracted from API 1 at iextrading
* Updates all equities files in the front symbol directory at $dir
*/
EQ::getEquilibriums(new EQ());
/**
* This is a key class for processing all equities including two other classes
* Stock
*/
class EQ
{
}
spl_autoload_register(array('EQ', 'autoload'));
本质上,您的自动加载器功能将 class 名称映射到文件名。例如:
class EQ
{
public function autoloader($classname)
{
$filename = __DIR__ . "/includes/$classname.class.php";
if (file_exists($filename)) {
require_once $filename;
} else {
throw new Exception(sprintf("File %s not found!", $filename));
}
}
}
spl_autoload_register(["EQ", "autoloader"]);
$st = new ST;
// ST.php should be loaded automatically
$st->doStuff();
但是,大部分内容都内置于 PHP 中,让您的代码更加简单:
spl_autoload_extensions(".php");
spl_autoload_register();
$st = new ST;
$st->doStuff();
只要 ST.php
在您的 include_path
中的任何位置,它就可以正常工作。不需要自动加载器功能。
我有一个名为 EQ
的主 class,连接到其他 classes,可以在这个 GitHub link.
EQ class 未连接到我的 composer,我在本地服务器中调用它使用:
php -f path/to/EQ.php
和使用 CRON 作业的实时服务器:
1,15,30,45 * * * * (sleep 12; /usr/bin/php -q /path/to/EQ.php >/dev/null 2>&1)
我不确定如何正确使用自动加载器并将所有相关文件加载到此 class,并删除 require_once
s。我已经尝试过了,它似乎确实有效:
spl_autoload_register(array('EQ', 'autoload'));
如何解决这个问题?
尝试
//Creates a JSON for all equities // iextrading API
require_once __DIR__ . "/EquityRecords.php";
// Gets data from sectors // iextrading API
require_once __DIR__ . "/SectorMovers.php";
// Basic Statistical Methods
require_once __DIR__ . "/ST.php";
// HTML view PHP
require_once __DIR__ . "/BuildHTMLstringForEQ.php";
// Chart calculations
require_once __DIR__ . "/ChartEQ.php";
// Helper methods
require_once __DIR__ . "/HelperEQ.php";
if (EQ::isLocalServer()) {
error_reporting(E_ALL);
} else {
error_reporting(0);
}
/**
* This is the main method of this class.
* Collects/Processes/Writes on ~8K-10K MD files (meta tags and HTML) for equities extracted from API 1 at iextrading
* Updates all equities files in the front symbol directory at $dir
*/
EQ::getEquilibriums(new EQ());
/**
* This is a key class for processing all equities including two other classes
* Stock
*/
class EQ
{
}
spl_autoload_register(array('EQ', 'autoload'));
本质上,您的自动加载器功能将 class 名称映射到文件名。例如:
class EQ
{
public function autoloader($classname)
{
$filename = __DIR__ . "/includes/$classname.class.php";
if (file_exists($filename)) {
require_once $filename;
} else {
throw new Exception(sprintf("File %s not found!", $filename));
}
}
}
spl_autoload_register(["EQ", "autoloader"]);
$st = new ST;
// ST.php should be loaded automatically
$st->doStuff();
但是,大部分内容都内置于 PHP 中,让您的代码更加简单:
spl_autoload_extensions(".php");
spl_autoload_register();
$st = new ST;
$st->doStuff();
只要 ST.php
在您的 include_path
中的任何位置,它就可以正常工作。不需要自动加载器功能。