Top > PHP > クラス定義とrequireのタイミング

インスタンスを生成するときは、そのクラスを同じファイル内で定義するか、実行時に事前にインクルードすること。
サブクラスを定義するときは、親クラスを同じファイル内で定義するか、前の行でインクルードすること。

オートローディングが有効になっていない限り、 クラスの定義は実際に使うより前になければなりません。 別のクラスを継承したクラスの場合は、 そのクラスより前に親クラスが宣言されていなければなりません。 この規則が適用されるのは、別のクラスやインターフェイスを継承したクラスです。
http://php.net/manual/ja/language.oop5.inheritance.php

よく分からない例:
↓これはOK

<?php

new Base();

class Hoge extends Base {
    function __construct() {
        parent::__construct();
        echo "created!\n";
    }
}

class Base {
    function __construct() {
        echo "Base created\n";
    }
}

↓これもOKだが

<?php

new Hoge();

class Base {
    function __construct() {
        echo "Base created\n";
    }   
}

class Hoge extends Base {
    function __construct() {
        parent::__construct();
        echo "created!\n";
    }   
}

これはNG
PHP Fatal error: Class 'Hoge' not found in /home/ao/tmp/phprequire/8.php on line 3

<?php

new Hoge();

class Hoge extends Base {
    function __construct() {
        parent::__construct();
        echo "created!\n";
    }
}

class Base {
    function __construct() {
        echo "Base created\n";
    }
}

クラスオートローディングを使うとサブクラスを定義するときもnewするときもrequireが必要なくなるので、できるならオートローディングすることをオススメ。

// クラスオートローディング
function classAutoLoad($class_name) {
    $path = strtolower($class_name) . '.php';
    if (file_exists($path)) {
        include $path;
        return;
    }
}

// クラスオートローディングを設定
spl_autoload_register('classAutoLoad');

1. クラス定義、newの順
→OK

<?php

class Hoge {
    function __construct() {
        echo "created!\n";
    }   
}

$a = new Hoge();

2. new、クラス定義の順
→OK

<?php

$a = new Hoge();

class Hoge {
    function __construct() {
        echo "created!\n";
    }
}

3. クラス定義、親定義インクルード、生成の順
エラー
PHP Fatal error: Class 'Base' not found in /home/ao/tmp/phprequire/3.php on line 3

<?php

class Hoge extends Base {
    function __construct() {
        parent::__construct();
        echo "created!\n";
    }   
}

require_once('base.php');
$a = new Hoge();

4. 親定義インクルード、new、クラス定義の順
PHP Fatal error: Class 'Hoge' not found in /home/ao/tmp/phprequire/4.php on line 4

<?php

require_once('base.php');
$a = new Hoge();

class Hoge extends Base {
    function __construct() {
        parent::__construct();
        echo "created!\n";
    }   
}

5. 親定義インクルード、クラス定義、newの順
OK

<?php

require_once('base.php');

class Hoge extends Base {
    function __construct() {
        parent::__construct();
        echo "created!\n";
    }   
}

$a = new Hoge();

6. クラス定義インクルード、newの順
OK(当たり前)

<?php

require_once('base.php');

new Base();

7. new、クラス定義インクルードの順
PHP Fatal error: Class 'Base' not found in /home/ao/tmp/phprequire/7.php on line 3

<?php

new Base();

require_once('base.php');

参考リンク Edit

[486] クラス継承を別ファイルにて - PHPの基礎体力掲示板
http://www.sound-uz.jp/php/bbs/thread/486?view=flat

クラスを継承する際、エラーが出てしまいます・・・ - PHPプロ!Q&A掲示板
http://www.phppro.jp/qa/895



URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes