※当サイトの記事には、広告・プロモーションが含まれます。

spl_autoload_register( )の引数のarray( )の意味が分からなかったので調べてみました

『パーフェクトPHP』って本で『spl_autoload_register( array( $this, 'loadClass' ))』って記述が『ClassLoader.php』ファイルの中で出てきました。

が、引数の配列(『array( $this, 'loadClass' )』)の意味がよく分からなかったので調べてみました。

core/ClassLoader.php

<?php
/*
オートロードに関する処理をまとめたクラス
*/
class ClassLoader{

    protected $dirs;

// PHPに自動読み込みクラスファイルを登録する関数(メソッド)

    public function register( ){


// $thisは擬似変数、ClassLoaderクラス自身のオブジェクト

// 外部では、$this = new ClassLoader( );としてプロパティやメソッドにアクセスできる

// 内部では、代わりに$thisで自身のプロパティやメソッドにアクセス
      spl_autoload_register(array($this, 'loadClass'));  

    }

// 自動読み込みさせたいクラスファイルを含むディレクトリ(フォルダ)を登録する関数(メソッド)

    public function registerDir($dir){

// $dirには登録したいフォルダへのフルパス
// $dirsプロパティ(変数(配列))に$dirを格納

      $this->dirs[ ] = $dir;

    }

// 引数を$class(クラス名)としたファイルを読み込む

    public function loadClass($class){

// $dirsプロパティ(変数(配列))の現在の要素の値を$dirとして、処理し、次の値に進み次の反復

        foreach($this->dirs as $dir){

// クラスファイルを含んだディレクトリのフルパスを$fileに格納

          $file = $dir . ' / '  .  $class  ' .php';

// ファイルが存在し読み込み可能であれば、$fileを読み込み

          if(is_readable($file)){

              require $file;

// 読み込めた場合、それ以外の処理は必要ないのでreturnで処理中断

              return;
          }

       }

    }

}

 

 この『spl_autoload_register( )』はPHP5で導入された『Standard PHP Library(SPL)』っていうクラスライブラリの中の関数の1つらしいです。

以下、PHPマニュアル(PHP:spl_autoload_register - Manual)の説明。

spl_autoload_register

(PHP 5 >= 5.1.2)

spl_autoload_register指定した関数を __autoload( ) の実装として登録する

説明

 bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

指定した関数を、spl が提供する __autoload キューに登録します。
キューがまだアクティブになっていない場合は、まずアクティブにします。

もしあなたのコード中に __autoload( ) 関数が存在するのなら、 それを明示的に __autoload キューに登録しなければなりません。
なぜなら、spl_autoload_register() は、 spl_autoload( ) あるいは spl_autoload_call( ) によって __autoload( ) 関数のエンジンキャッシュを効率的に置き換えるからです。

複数の autoload 関数が必要となる場合でも spl_autoload_register( ) は対応できます。
この関数は autoload 関数のキューを作成し、 定義された順にそれを実行していきます。
一方 __autoload( ) は、一度しか定義できません。

パラメータ(引数)

autoload_function($autoload_function)[データ型:callable]

登録したい autoload 関数。
パラメータが指定されなかった場合は、デフォルト実装である spl_autoload( ) が登録されます。

throw($throw)[データ型:bool]

このパラメータは、 spl_autoload_register( )autoload_function を登録できなかったときに例外をスローするかどうかを指定します。

prepend($prepend)[データ型:bool]

true の場合、spl_autoload_register( ) はキューの最後に追加するのではなく先頭に追加します。

 

返り値

成功した場合に TRUE を、失敗した場合に FALSE を返します。

 『spl_autoload_register( )』の第1引数が『callable』という型ということで『callbale』のPHPマニュアルの情報が下記。

『Callback = Callable』ということらしいです。

 

コールバック / Callable

コールバックは、PHP 5.4 以降では callable タイプヒントで表されます。
このページでは、callback 型情報を同じ目的で使っています。

call_user_func( )usort( ) 等の関数は、ユーザーが定義するコールバック関数を引数として受け入れます。
コールバック関数は、単純な関数だけでなく、オブジェクトのメソッド あるいはクラスの静的メソッドであってもかまいません。

オブジェクトのインスタンスを渡すには 配列 を使います。
配列の 0 番目の要素にオブジェクトを、 そして 1 番目の要素にメソッド名を指定します。

静的なクラスメソッドの場合、オブジェクトのインスタンスは不要です。
0 番目の要素として、オブジェクトのかわりにクラス名を指定します。
PHP 5.2.3 以降では、 'ClassName::methodName' 形式で指定することもできます。

以下は 変数操作関数の『is_callable』のPHPマニュアルの説明

 

is_callable

(PHP 4 >= 4.0.6, PHP 5, PHP 7)

is_callable引数が、関数としてコール可能な構造であるかどうかを調べる

説明

 bool is_callable ( mixed $var [, bool $syntax_only = false [, string &$callable_name ]] )

引数の内容が、関数としてコール可能かどうかを調べます。
変数が有効な関数名かどうかを調べたり、配列の中に適切に エンコードされたオブジェクトと関数名が格納されているかどうかを 調べたりすることが可能です。

パラメータ(引数)

var($var)[データ型:mixed]

チェックする値。

syntax_only($syntax_only)[データ型:bool]

TRUE の場合、この関数は単に name が関数またはメソッドであるかどうかだけを調べます。
文字列以外の型の変数や不正な形式の配列は、 引数として受け付けられません。
有効な配列の形式は、 最初のエントリがオブジェクトあるいは文字列で、2 番目のエントリが文字列である 2 つのエントリからなるものです。

callable_name($callable_name)[データ型:string]

"呼び出し名" を受け取ります。
下の例では "someClass::someMethod" です。
これは someClass::SomeMethod( ) が static メソッドであるかのようにみえますが、 そうではないことに注意しましょう。

返り値

var がコール可能な場合に TRUE、 それ以外の場合に FALSE を返します。

 例 is_callable( ) の例

<?php
//  変数が、関数としてコール可能かどうかを確かめます。
//
//  関数名を含む単純な配列の場合
//

function someFunction() 
{
}

$functionVariable 'someFunction';

var_dump(is_callable($functionVariablefalse$callable_name));  // bool(true)

echo $callable_name"\n";  // someFunction

//
//  メソッドを含む配列の場合
//

class someClass {

  function 
someMethod() 
  {
  }

}
// someClassクラスのオブジェクトを生成し、参照型変数の$anObjectに格納
$anObject = new someClass();
// 配列array()に、第1引数に$anObject(someClassクラスのオブジェクト)、第2引数にsomeClassクラスのメソッド(関数)を指定。

$methodVariable = array($anObject'someMethod');



var_dump(is_callable($methodVariabletrue$callable_name));  //  bool(true)

echo $callable_name"\n";  //  someClass::someMethod

?>

 

 『spl_autoload_register( )』は、自分で作ったクラスの中の関数を『__autoload( )』の機能を持った関数として登録できるということらしいです。

『__autoload( )』はPHPマニュアルによると

 

__autoload

(PHP 5)

__autoload未定義のクラスのロードを試みる

説明

 void __autoload ( string $class )

この関数を定義すれば、クラスのオートローディング を有効にできます。
ただし、__autoload( )は一度しか定義できません。

パラメータ(引数) ¶

class($class)[データ型:string]

ロードするクラスの名前。

返り値

値を返しません。

  例 __autoload( ) の例

./myClass.php
<?php
class myClass {
    public function
__construct() {
        echo
"myClass init'ed successfuly!!!";
    }
}
?>

./index.php
<?php
// $filenameを一度呼び出す関数

// $filenameは『./引数で入力された文字列.php』、引数で入力された文字列($classname)を名前としたphpファイルになります

function __autoload($classname) {
   
$filename = "./". $classname .".php";
    include_once(
$filename);
}

// myClass.phpをincludeしたことになります

// その結果、myClassクラスの__constract()が実行され(『__constract()』はオブジェクトが生成される同時に1度だけ自動で実行される関数)、"myClass init'ed successfuly!!!"がechoされる。

$obj = new myClass();
?>

So, if you call a class that named as myClass then a file will be included myClass.php if it exists (if not you get an include error normally). If you call Foo, Foo.php will be included, and so on...

And you don't need some code like this anymore;

// 下記のようにinclude_onceで記述する必要はない
<?php
include_once("./myClass.php");
include_once(
"./myFoo.php");
include_once(
"./myBar.php");


// クラスのオブジェクトを生成すれば、それぞれのファイルをincludeしたことになる

// ただし、そのクラスのファイルが作られていることが前提。

// フレームワークでファイル名についての規約が細かかったりするのは、こういうこと?かと。

$obj = new myClass();
$foo = new Foo();
$bar = new Bar();
?>

 

 

 つまり、__autoload( )では

 

<?php
class myClass {

  function __autoload($classname) {
   
$filename = "./". $classname .".php";
    include_once(
$filename);
  }

}

 

1つしか関数が作れないですが、__autoload( )じゃなければ

 

<?php
class myClass {

  public function loadClass($Class) {
   
$filename = "./". $classname .".php";
    include_once(
$filename);
  }

}

 

いくらでも関数が作れて、『__autoload( )』のような機能を持たせるために『spl_autoload_register( )』を使って登録するってことかと思われます。

spl_autoload_register( )』があれば、__autoload( )』は必要ないってことなのかしら?

 

⇩ クラスのオートローディングについてのPHPマニュアルの見解

spl_autoload_register() を使えば、より柔軟にクラスのオートロードができます。 そのため、今や __autoload() を使うことはおすすめできません。 将来のバージョンではこの機能が非推奨となり、削除されるかもしれません。