我正在开发一个项目,我有以下文件结构:
index.php
|---lib
|--|lib|type|class_name.php
|--|lib|size|example_class.php
Run Code Online (Sandbox Code Playgroud)
我想自动加载类,class_name和example_class(命名与PHP类相同),所以在index.php中类已经被实例化,所以我可以这样做:
$class_name->getPrivateParam('name');
Run Code Online (Sandbox Code Playgroud)
我已经看过网了但是找不到合适的答案 - 任何人都可以帮帮我吗?
谢谢你的回复.让我扩展我的方案.我正在尝试编写一个WordPress插件,可以将其放入项目中,并通过将类放入文件夹"功能"(例如插件内部)来添加其他功能.永远不会有1000个班级,推动可能10个?
我可以编写一个方法来迭代'lib'文件夹的文件夹结构,包括每个类然后将它分配给一个变量(类名),但不认为这是一个非常有效的方法,但它也许这似乎是达到我需要的最佳方式?
据http://php.net/manual/en/language.oop5.autoload.php神奇功能__autoload()将在即将到来的PHP版本变得过时和已删除(!).官方替代方案是spl_autoload().见http://www.php.net/manual/en/function.spl-autoload.php.但是php手册没有解释这个宝宝的正确使用方法.
我的问题:如何替换这个(我的自动类自动加载器)
function __autoload($class) {
include 'classes/' . $class . '.class.php';
}
Run Code Online (Sandbox Code Playgroud)
使用spl_autoload()的版本?问题是:我无法弄清楚如何给该函数一个路径(它只接受命名空间).
顺便说一下:SO.com上有很多关于这个话题的主题,但没有一个提供干净简单的解决方案来取代我的性感单行.
我正在学习PHP 5.3中的命名空间,我想使用命名空间自动加载.我找到了这个SplClassLoader类,但我无法弄清楚它是如何工作的.
假设我有这样的目录结构:
system
- framework
- http
- request.php
- response.php
index.php
SplClassLoader.php
Run Code Online (Sandbox Code Playgroud)
如何启用类自动加载?应该什么命名空间request.php和response.php有哪些?
这是request.php:
namespace framework\http;
class Request
{
public function __construct()
{
echo __CLASS__ . " constructer!";
}
}
Run Code Online (Sandbox Code Playgroud)
这是response.php:
namespace framework\http;
class Request
{
public function __construct()
{
echo __CLASS__ . " constructed!";
}
}
Run Code Online (Sandbox Code Playgroud)
在index.php我有:
require_once("SplClassLoader.php");
$loader = new SplClassLoader('framework\http', 'system/framework');
$loader->register();
$r = new Request();
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
Fatal error: Class 'Request' not found …Run Code Online (Sandbox Code Playgroud) I'm playing around with the SPL autoload functionality and seem to be missing something important as I am currently unable to get it to work. Here is the snippet I am currently using:
// ROOT_DIRECTORY translates to /home/someuser/public_html/subdomains/test
define('ROOT_DIRECTORY', realpath(dirname(__FILE__)));
define('INCLUDE_DIRECTORY', ROOT_DIRECTORY . '/includes/classes/');
set_include_path(get_include_path() . PATH_SEPARATOR . INCLUDE_DIRECTORY);
spl_autoload_extensions('.class.php, .interface.php, .abstract.php');
spl_autoload_register();
Run Code Online (Sandbox Code Playgroud)
When I echo get_include_path() I do get the path I expected:
// Output echo get_include_path();
.:/usr/lib/php:/usr/local/lib/php:/home/someuser/public_html/subdomains/test/includes/classes/
Run Code Online (Sandbox Code Playgroud)
However when I run the code I get this error message: …
我有这个自动加载器类classes最初自动加载,但现在我想自动加载interfaces,abstracts以及.
所以我按照这个答案做了改变,
$reflection = new ReflectionClass($class_name);
# Return boolean if it is an interface.
if ($reflection->isInterface())
{
$file_name = 'interface_'.strtolower(array_pop($file_pieces)).'.php';
}
else
{
$file_name = 'class_'.strtolower(array_pop($file_pieces)).'.php';
}
Run Code Online (Sandbox Code Playgroud)
我测试了它,但这个自动加载器类根本不加载接口.我错过了什么想法?
例如,这是我的界面文件,
interface_methods.php
Run Code Online (Sandbox Code Playgroud)
及其内容,
interface methods
{
public function delete();
}
Run Code Online (Sandbox Code Playgroud)
下面是我的整个自动加载器类.
class autoloader
{
/**
* Set the property.
*/
public $directory;
public $recursive;
public function __construct($directory, $recursive = array('search' => 'models') )
{
# Store the data …Run Code Online (Sandbox Code Playgroud) 我真的没有得到spl_autoload的文档
bool spl_autoload_register ([ callback $autoload_function ] )
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当php遇到未加载的类时,它将尝试运行已注册的函数.举个例子,
public function autoload() {
require ('nonLoadedClass.php');
}
spl_autoload_register(autoload);
$x = new nonLoadedClass();
Run Code Online (Sandbox Code Playgroud)
会导致要求运行吗?所以我还可以注册许多自动加载功能?
public function autoloadXXX() {...}
public function autoloadYYY() {...}
public function autoloadZZZ() {...}
spl_autoload_register('autoloadXXX');
spl_autoload_register('autoloadYYY');
spl_autoload_register('autoloadZZZ');
Run Code Online (Sandbox Code Playgroud)
在学说的情况下,
require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));
Run Code Online (Sandbox Code Playgroud)
一个数组被传递,所以我想它会尝试在Doctrine类中运行自动加载功能(这是必需的)?
在我在服务器端的include_path中,我在'/ usr/share/pear /'中引用了一个pear目录.在我的应用程序中,我包含来自公共库的文件,位于'/ usr/share/pear/library /'中require_once 'library/file.php'.
我最近开始使用spl自动加载器,我注意到在加载器函数中你必须确定包含文件的逻辑.我这样做的第一种方法是尝试包含一个文件并用它@来抑制它以查看它是否会失败,例如,@include 'library/file.php'我认为主要是因为我读了很多关于@不良做法的事情我决定通过爆炸get_include_path来自己手动完成工作.PATH_SEPARATOR并查看目录是否是我想要的目录,然后执行file_exists并包含它.
像这样:
function classLoader( $class ) {
$paths = explode( PATH_SEPARATOR, get_include_path() );
$file = SITE_PATH . 'classes' . DS . $class . '.Class.php';
if ( file_exists( $file) == false )
{
$exists = false;
foreach ( $paths as $path )
{
$tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php'; …Run Code Online (Sandbox Code Playgroud) 我一直在尝试自动加载器类目录映射技术,这有点困难.我设法提出了一个相当直接的解决方案(表面上看),但我完全神秘的是它完全有效,而其他"更明显"的解决方案失败了.下面是一些代码片段,说明了我的困惑.
这是工作代码:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$classMap = array(
'classes/',
'classes/sites/',
'classes/data/'
);
foreach ($classMap as $location) {
if (!@include_once($location . $class . '.php')) { // @ SUPPRESSES include_once WARNINGS
// CLASS DOESN'T EXIST IN THIS DIRECTORY
continue;
} else {
// CLASS IS AUTO-LOADED
break;
}
}
}
?>
Run Code Online (Sandbox Code Playgroud)
这是我觉得应该工作的片段,但不是:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$classMap = array(
'classes/',
'classes/sites/',
'classes/data/'
);
foreach ($classMap as $location) {
if (file_exists($location . $class . '.php')) {
require_once ($location …Run Code Online (Sandbox Code Playgroud)