2016-11-08 5 views
2

私はPHPが巣クラスではないことを知っているが、2つのクラスが2つのファイルにしていることができるかどうかということらしい:PHPはクラスを2つのファイルにネストできますか?

MainClass.php:

<?php 
ini_set('display_errors', 'On'); 
error_reporting(E_ALL | E_STRICT); 

class mainclass 
{ 
    private $var; 
    public function __construct() 
    { 
    require_once ('subclass.php'); 
    $subinstant = new subclass(); 
    } 
} 
$maininstant = new mainclass(); 

そしてsubclass.php

<?php 
ini_set("display_errors", "On"); 
error_reporting(E_ALL | E_STRICT); 
class subclass 
{ 
    public function __construct() 
    { 
    $this->var="this-var\n"; 
    echo $this->var; 
    $test="test in construct\n"; 
    echo $test; 
    function testvar() 
    { 
     //$this->var = "this-var in fun\n"; 
     //echo $this->var; 
     $funtest="test in fun\n"; 
     echo $funtest; 
    } 
    testvar(); 
    } 
} 

エラーは出力されず、結果は期待どおりです。私はちょうどrequire_onceを理解していない、それはsubclass.phpのコードを含むようだ、違いは何ですか、同じ位置に直接書くことに比べて?

さらに$vartestvar()にアクセスするにはどうすればよいですか。 (あなたが考えることができる多くの方法を使用してください)、ありがとう!

+0

これらはネストされたクラスではありません。必要な/インクルードされたファイルは、実行時に 'require'または' include'文に達したときに解析されます。 'require'はコピー・ペーストではありません。 – axiac

答えて

2

require_onceの$ varにはアクセスできません。他のクラスのコードは現場には含まれていません。 require,require_once,includeおよびinclude_onceの動作は一意です。現在のオブジェクトを「残し」、要求されたファイルのコードをグローバルスコープに「マージ」します。

これは(あなたがmainclassのインスタンスを作成するときに)あなたがこの

class mainclass 
{ 
    private $var; 
    public function __construct() 
    { 
    require_once ('subclass.php'); 
    $subinstant = new subclass(); 
    } 
} 

として認識することはPHPインタプリタが実際にこれを見ていることを、意味:

class mainclass 
{ 
    private $var; 
    public function __construct() 
    { 
    $subinstant = new subclass(); 
    } 
} 

class subclass 
{ 
    public function __construct() 
    { 
    $this->var="this-var\n"; 
    echo $this->var; 
    $test="test in construct\n"; 
    echo $test; 
    function testvar() 
    { 
     //$this->var = "this-var in fun\n"; 
     //echo $this->var; 
     $funtest="test in fun\n"; 
     echo $funtest; 
    } 
    testvar(); 
    } 
} 
$maininstant = new mainclass(); 

@Federkunコメントで指摘したようにこの投稿には、実際にはdocsに書かれています:

ただし、すべての機能インクルードされたファイルに定義されているnsおよびクラスはグローバルスコープを持ちます。

+2

doc here:http://php.net/manual/en/function.include.php - > "ただし、インクルードされたファイルに定義されているすべての関数とクラスはグローバルスコープを持ちます。" – Federkun

+0

@Federkunありがとう、私はそれがそこにあるかどうか思い出すことができなかったので、私は実際にドキュメントを検索したことはありません。 –

+1

もう1つのことをここで言及する必要があります。 'mainclass'クラスのインスタンスが作成されない場合、必要なファイルはロードされず、' subclass'クラスは定義されません。 – axiac

1

はいすべてが同じスコープに入っているので、1つのファイルに任意の数のクラスを定義することができます。異なる名前を付ける必要があります。 $ this-> varを使って$ varにアクセスすることはできますが、別のクラスのあるクラスのプライベート変数にアクセスすることはできません。 あなたのコードでは、

関連する問題