web-dev-qa-db-ja.com

PHPクラスを別のクラス内にインスタンス化できますか?

別のクラス内にクラスのインスタンスを作成できるかどうか疑問に思っていました。

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

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

class some{

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

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

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

class some {

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

}
35

「クラス内にクラスを作成できる」と言う人は、クラス内にオブジェクト/インスタンスを作成できることを意味しているようです。別のクラス定義内の実際のクラス定義の例を見たことはありません。

class myClass{

    class myNestedClass{

    }

}

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

質問は「createクラスinside別のクラスにできるか」だったので、今では不可能だとしか思えない。

16
vincentDV

クラス定義を別のクラス定義内に動的にロードできることを指摘したかっただけです。

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

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

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

14
rickchristie

PHPの別のクラスにクラスを作成することはできません。別のオブジェクトにオブジェクト(クラスのインスタンス)を作成することは別です。

4
Marius Burz

いいえ、できません。クラスのネストとオブジェクトの集約は、異なるメカニズムです。クラスのネストとは、実際にはクラス名のネストを意味します。クラスBにネストされたクラスAは、「B\A」(?)という名前になります。 v5.3以降では、名前空間にクラス名(およびその他の名前)をネストできます。

2
Radek M

これは、PHP 7 with 匿名クラス で可能です。

ドキュメント の例を参照してください:

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;
    }
});
1
Jon Surrell

私は今これを見ています、そしてコメントを追加したいと思います。それは誰にとっても有益かもしれません。誰かがPHPの特徴を聞いたことがありますか?特性は別のクラスをインポートせず、特性を別のクラスにインポートするだけです。したがって、いくつかのクラスをインポートしようとする代わりに、サブクラスが特性のように機能し、メイン/親クラスでそれらを使用できるようにしながら、メインクラスを持つことができます

0
teymzz

(編集)Ok=あなたが達成しようとしていることの質問と例は紛らわしい。あなたの例から別のクラス内のクラスを定義しようとしているようだ。

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

たとえば、これはPHPでは動作しません

class outer_class{
    class inner_class{
        ...
    }
    ...
}

ここで質問されるのは、クラスのインスタンスを別のクラスに作成することです。

これに対する答えは「YES」です。「クラス」内の「オブジェクト」をインスタンス化できます。いつもやっています。

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 pattern です。悲しいことに、一部の人々は、 依存性注入 について知ることは、メソッドで再びNEWを呼び出さないことを意味すると信じています。違う。

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

0