2009-10-17 9 views
38

別のクラスの中でクラスのインスタンスを作成することが許可されているのだろうかと思っていました。別のクラスの中でPHPクラスをインスタンス化することはできますか?

または、外部に作成してから、コンストラクタに渡す必要がありますか?しかし、私はそれを必要とするかどうかを知らずに作成したでしょう。

例(データベースクラス):

class some{ 

if(.....){ 
include SITE_ROOT . 'applicatie/' . 'db.class.php'; 
$db=new db 

答えて

29

あなたは別のクラスでクラスを定義することはできません。クラスの外に他のクラスのファイルを含める必要があります。あなたのケースでは、それはあなたに2つのトップレベルのクラスdbsomeを与えるでしょう。今度はsomeのコンストラクタでdbのインスタンスを作成することができます。例:

include SITE_ROOT . 'applicatie/' . 'db.class.php'; 

class some { 

    public function __construct() { 
     if (...) { 
      $this->db = new db; 
     } 
    } 

} 
+10

'include 'の代わりに' require'を使うことをお勧めします。 –

+2

これは、依存性注入デザインパターンを利用するための良い状況のようにも見えます。 – Ejaz

+6

@ rink.attendant.6 'require_once'はさらに良いです:D –

2

PHPの別のクラスでクラスを作成することは不可能です。 別のオブジェクトにオブジェクト(クラスのインスタンス)を作成することは別のことです。

+0

これに類似したことをどうやってやりますか? –

13

クラス定義を別のクラス定義の中に動的にロードすることが可能であることを指摘しておきました。

ルーカスは別のクラスの中にクラスを定義することはできませんが、インクルードされたファイルに定義されているすべての関数とクラスがグローバルなスコープを持つため、それらを動的にインクルード(またはrequire)できます。クラスまたは関数を動的にロードする必要がある場合は、そのクラスの関数の1つにファイルを含めるだけです。

function some() 
{ 
    require('db.php'); 
    $db = new Db(); 
    ... 
} 

http://php.net/manual/en/function.include.php

+1

動的クラスの読み込みでは、 'require_once'または' include_once'を使うことをお勧めします。 - あなたがそれを複数回インクルードしなかったことを確認する方法:) –

+2

この場合、 "include_once"そのファイル(機能が定義されている場合)がシステムに組み込まれたときに呼び出されます。サブルーチンではincludeまたはinclude_onceを使用できます。ポインタがそのサブルーチンに入ると実行されます –

2

いいえ、それは不可能です:あなたはこれを行うことができます。クラスのネストとオブジェクトの集約は、異なるメカニズムです。ネストクラスとは、実際にはのネストクラス名を意味します。クラスBにネストされたクラスAの名前は "B \ A"(?)となります。 v5.3以降では、ネームスペースにクラス名(およびその他の名前)をネストすることができます。

16

「クラス内にクラスを作成する」ことができる人は、クラス内にオブジェクト/インスタンスを作成することができます。私は、「内の別のクラスをクラスを作成することが可能である」質問がされて以来

class myClass{ 

    class myNestedClass{ 

    } 

} 

/* THIS IS NOT ALLOWED AND SO IT WON'T WORK */ 

:私は次のようになり、別のクラス定義内の実際のクラス定義の例を見ていません今は不可能であると仮定することができます。

+0

他のプログラミング言語でも例がありますが、ネストされたクラスは便利です:http://docs.oracle.com/javase/tutorial/java/javaOO/nested html –

1

これは、PHP 7で可能です。Anonymous classesです。

the docsからの例を参照してください:

class Outer 
{ 
    private $prop = 1; 
    protected $prop2 = 2; 

    protected function func1() 
    { 
     return 3; 
    } 

    public function func2() 
    { 
     return new class($this->prop) extends Outer { 
      private $prop3; 

      public function __construct($prop) 
      { 
       $this->prop3 = $prop; 
      } 

      public function func3() 
      { 
       return $this->prop2 + $this->prop3 + $this->func1(); 
      } 
     }; 
    } 
} 

echo (new Outer)->func2()->func3(); 
// Output: 6 

これは、匿名クラスの使用方法を示す簡単な例ではなく、クラス内から:

// Pre PHP 7 code 
class Logger 
{ 
    public function log($msg) 
    { 
     echo $msg; 
    } 
} 

$util->setLogger(new Logger()); 

// PHP 7+ code 
$util->setLogger(new class { 
    public function log($msg) 
    { 
     echo $msg; 
    } 
}); 
+0

func3は '外部'クラスのインスタンスでグローバルに使用できませんか? –

+1

@ChrisO Nope。 (0)=> func2) ' –

+0

それはあまりにも悪いですが、とにかくそれは何かです。ちょっとした文法、ありがとう。 :) –

0

(編集)[OK]を質問し、達成しようとしているものの例は混乱しています。 あなたの例では、別のクラスの中でクラスを定義しようとしているようです。

正しい名前はNESTED CLASSで、PHPでは使用できません。 あなたの例では、答えは "いいえ"です。とにかくPHPではそうではありません。他の言語では、「ネストされたクラス」が許可されます。 Javaがその例です。

は、例えば、これはこれで尋ねた質問は別のクラスにクラスのインスタンスを作成することです
class outer_class{ 
    class inner_class{ 
     ... 
    } 
    ... 
} 

PHP

では動作しません。

これは「はい」です。これは、「クラス」内の「オブジェクト」を組み込むことができます。私たちはいつもそれをやります。

class simple_class{ 

    protected $instanceOfOtherClass; 

    public function instanciateObject_KeepingAReferenceToIt(){ 
     // create an instance of OtherClass and associate it to $this->instanceOfOtherClass 
     $this->instanceOfOtherClass = new OtherClass(); 
    } 

    public function instanciateObject_Without_KeepingAReferenceToIt(){ 
     // create an instance of OtherClass and return it 
     return new OtherClass(); 
    } 
} 

クラスはインスタンス化することもできます。それは有名なシングルトンがやっているものなのですが、他の多くはCreational patternsです。悲しいことに、一部の人々は、約dependency injectionについて知っていることは、決して再びメソッドでNEWを呼び出さないことを意味すると信じています。違う。

クラスとオブジェクトの違いを理解するのに役立ちます。 classは、オブジェクトを作成するための拡張可能なプログラムコードテンプレートです。 objectは、クラスの特定のインスタンスを指します。

関連する問題