标签: spl-autoloader

PHP中自动加载类的最佳方法

我正在开发一个项目,我有以下文件结构:

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'文件夹的文件夹结构,包括每个类然后将它分配给一个变量(类名),但不认为这是一个非常有效的方法,但它也许这似乎是达到我需要的最佳方式?

php spl-autoloader

21
推荐指数
2
解决办法
7万
查看次数

如何使用spl_autoload()作为__autoload()进行DEPRECATED

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 deprecated autoload spl-autoloader

19
推荐指数
1
解决办法
4万
查看次数

使用SplClassLoader进行PHP自动加载?

我正在学习PHP 5.3中的命名空间,我想使用命名空间自动加载.我找到了这个SplClassLoader类,但我无法弄清楚它是如何工作的.

假设我有这样的目录结构:

system
  - framework
    - http
      - request.php
      - response.php
index.php
SplClassLoader.php
Run Code Online (Sandbox Code Playgroud)

如何启用类自动加载?应该什么命名空间request.phpresponse.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)

php autoload spl-autoloader

12
推荐指数
1
解决办法
7912
查看次数

Using spl_autoload() not able to load class

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: …

php spl spl-autoloader

8
推荐指数
1
解决办法
1万
查看次数

PHP:如何自动加载接口和摘要

我有这个自动加载器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)

php spl-autoloader

8
推荐指数
1
解决办法
6558
查看次数

PHP spl_autoload

我真的没有得到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类中运行自动加载功能(这是必需的)?

php spl-autoloader

6
推荐指数
1
解决办法
4792
查看次数

SPL自动加载最佳实践

在我在服务器端的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 autoloader spl-autoloader

5
推荐指数
1
解决办法
3696
查看次数

php autoloader:为什么这个工作?

我一直在尝试自动加载器类目录映射技术,这有点困难.我设法提出了一个相当直接的解决方案(表面上看),但我完全神秘的是它完全有效,而其他"更明显"的解决方案失败了.下面是一些代码片段,说明了我的困惑.

这是工作代码:

<?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)

php spl-autoloader

5
推荐指数
1
解决办法
398
查看次数

标签 统计

php ×8

spl-autoloader ×8

autoload ×2

spl ×2

autoloader ×1

deprecated ×1