web-dev-qa-db-ja.com

クラスを自動ロードする最良の方法PHP

私は次のファイル構造を持つプロジェクトに取り組んでいます:

index.php
|---lib
|--|lib|type|class_name.php
|--|lib|size|example_class.php

クラスclass_nameおよびexample_class(PHPクラス)と同じ名前)を自動的にロードしたいので、index.phpでクラスが既にインスタンス化されているので、次のことができます。

$class_name->getPrivateParam('name');

私はネットを見ましたが、正しい答えを見つけることができません-誰も私を助けてくれますか?

編集

返信いただきありがとうございます。シナリオを詳しく説明します。私はプロジェクトにドロップできるWordPressプラグインを作成しようとしています。追加機能は、プラグイン内などの「機能」フォルダにクラスをドロップすることで追加されます。 1000クラス、プッシュで10か?

'lib'フォルダーのフォルダー構造(すべてのクラスを含む)を反復処理するメソッドを作成し、それを(クラス名の)変数に割り当てることができますが、それが非常に効率的な方法だとは思いませんでしたが、おそらく私が必要なものを達成するための最良の方法だと思われますか?

21
Sjwdavies

クラスを自動ロードする必要がある場合は、SPL自動ロードで名前空間とクラス名の規則を使用してください。リファクタリングの時間を節約できます。そしてもちろん、すべてのクラスをオブジェクトとしてインスタンス化する必要があります。ありがとうございました。

このスレッドのように: PHP Autoloading in Namespaces

ただし、複雑な回避策が必要な場合は、Symfonyのautoloadクラスをご覧ください。 https://github.com/symfony/ClassLoader/blob/master/ClassLoader.php

またはこのように(私は私のプロジェクトの1つでそれをしました):

<?
spl_autoload_register(function($className)
{
    $namespace=str_replace("\\","/",__NAMESPACE__);
    $className=str_replace("\\","/",$className);
    $class=CORE_PATH."/classes/".(empty($namespace)?"":$namespace."/")."{$className}.class.php";
    include_once($class);
});
?>

そして、次のようにクラスをインスタンス化できます:

<?
$example=new NS1\NS2\ExampleClass($exampleConstructParam);
?>

これはあなたのクラスです(/NS1/NS2/ExampleClass.class.phpにあります):

<?
namespace NS1\NS2
{
    class Symbols extends \DB\Table
    {
        public function __construct($param)
        {
            echo "hello!";
        }
    }
}
?>
31
Serge Velikanov

コマンドラインにアクセスできる場合は、classMapセクションのcomposerで次のように試してください。

{
    "autoload": {
        "classmap": ["yourpath/", "anotherpath/"]
    }
}

wordpress有効にするプラグインcomposerでwordpress cli: http:// wordpress .org/plugins/composer /

10
lilobase

http://php.net/manual/de/function.spl-autoload-register.php

spl_autoload_register(function ($class) {
    @require_once('lib/type/' . $class . '.php');   
    @require_once('lib/size/' . $class . '.php');
});
3
Daniel W.
_function __autoload($class_name) {
   $class_name = strtolower($class_name);
   $path       = "{$class_name}.php";
   if (file_exists($path)) {
       require_once($path);
   } else {
       die("The file {$class_name}.php could not be found!");
   }
}
_

PDATE:__autoload()は、PHP 7.2

3
Hassan Azimi

ここにオートロードと初期化に使用する例があります。
基本的に、クラスを初期化するたびにクラスファイルのみを要求しようとするため、spl_autoload_registerのより良いバージョンです。
ここでは、クラスフォルダー内のすべてのファイルを自動的に取得し、ファイルを必要とし、それを初期化します。あなたがしなければならないのは、クラスにファイルと同じ名前を付けることです。
index.php

<?php
require_once __DIR__ . '/app/autoload.php';

$loader = new Loader(false);

User::dump(['hello' => 'test']);

autoload.php

<?php
class Loader 
{

    public static $library;

    protected static $classPath = __DIR__ . "/classes/";

    protected static $interfacePath = __DIR__ . "/classes/interfaces/";

    public function __construct($requireInterface = true) 
    {
        if(!isset(static::$library)) {
            // Get all files inside the class folder
            foreach(array_map('basename', glob(static::$classPath . "*.php", GLOB_BRACE)) as $classExt) {
                // Make sure the class is not already declared
                if(!in_array($classExt, get_declared_classes())) {
                    // Get rid of php extension easily without pathinfo
                    $classNoExt = substr($classExt, 0, -4); 
                    $file = static::$path . $classExt;

                    if($requireInterface) {
                        // Get interface file
                        $interface = static::$interfacePath . $classExt;
                        // Check if interface file exists
                        if(!file_exists($interface)) {
                            // Throw exception
                            die("Unable to load interface file: " . $interface);
                        }

                        // Require interface
                        require_once $interface;
                        //Check if interface is set
                        if(!interface_exists("Interface" . $classNoExt)) {
                            // Throw exception
                            die("Unable to find interface: " . $interface);
                        }
                    }

                    // Require class
                    require_once $file;
                    // Check if class file exists
                    if(class_exists($classNoExt)) {
                        // Set class        // class.container.php
                        static::$library[$classNoExt] = new $classNoExt();
                    } else {
                        // Throw error
                        die("Unable to load class: " . $classNoExt);
                    }

                }
            }
        }
    }

    /*public function get($class) 
    {
        return (in_array($class, get_declared_classes()) ? static::$library[$class] : die("Class <b>{$class}</b> doesn't exist."));
    }*/
}

少しのコーディングで簡単に管理でき、異なるフォルダーのクラスも必要になります。
うまくいけば、これはあなたにとって役に立つでしょう。

2
anttwuan

このオートローダーを使用して、名前空間に適したオートロードを指定できます。

<?php
spl_autoload_register(function($className) {
    $file = __DIR__ . '\\' . $className . '.php';
    $file = str_replace('\\', DIRECTORY_SEPARATOR, $file);
    if (file_exists($file)) {
        include $file;
    }
});

クラスファイルの場所を正しく指定してください。

ソース

0
Supun Kavinda