Bir dize ile PHP sınıfı örneği oluşturma


223

İki dersim var class ClassOne { }ve class ClassTwo {}. Ya "One"da olabilir bir dize alıyorum "Two".

Aşağıdakiler switchgibi uzun bir ifade kullanmak yerine :

switch ($str) {
    case "One":
        return new ClassOne();
    case "Two":
        return new ClassTwo();
}

Bir dize kullanarak bir örnek oluşturmak için bir yolu var mı, yani new Class("Class" . $str);?

Yanıtlar:


484

Evet yapabilirsin!

$str = 'One';
$class = 'Class'.$str;
$object = new $class();

Ad alanlarını kullanırken tam adı girin :

$class = '\Foo\Bar\MyClass'; 
$instance = new $class();

Php yapabileceğiniz diğer serin şeyler şunlardır:
Değişken değişkenler :

$personCount = 123;
$varname = 'personCount';
echo $$varname; // echo's 123

Ve değişken fonksiyonlar ve yöntemler.

$func = 'my_function';
$func('param1'); // calls my_function('param1');

$method = 'doStuff';
$object = new MyClass();
$object->$method(); // calls the MyClass->doStuff() method. 

1
Örnekler için teşekkürler!
Joel

28
Bilginize, bir değişkeni kısmen kullanamazsınız. Örneğin. $my_obj = Package\$class_name();. Bunun yerine$class_name = "Package\\" . $class_name; $my_obj = new $class_name();
Birla

14
$className = '\Foo\Bar\MyClass'; $instance = new $className();
Ad

5
Kaşık yok ... sadece php.
Kaptan Hypertext

4
ama bir soru. Yukarıda açıklanan yöntem yeni bir sınıf örneği oluşturmak için kullanılabilir. Varolan bir sınıfın yöntemini statik olarak çağırmak istersem ne olur? Aşağıdaki gibi denedim: denilen sınıfın dize içeren değişken $model = $user_model::find()->All(); nerede$user_model
Ramesh Pareek 23:30

22

Yeni bir sınıf oluşturmak için aşağıdaki sözdizimini kullanabilirsiniz (bir fabrika oluşturuyorsanız bu kullanışlıdır ):

$className = $whatever;
$object = new $className;

(İstisnai derecede kaba) bir örnek fabrika yöntemi olarak:

public function &factory($className) {

    require_once($className . '.php');
    if(class_exists($className)) return new $className;

    die('Cannot create new "' . $className . '" class - includes not found or class unavailable.');
}

1
Sınıf adı ve uzantı arasında bir noktayı kaçırmıyor musunuz? require_once($className.'php'); ->require_once($className.'.php');
J Quest


4

Diyelim ki ClassOne:

public class ClassOne
{
    protected $arg1;
    protected $arg2;

    //Contructor
    public function __construct($arg1, $arg2)
    {
        $this->arg1 = $arg1;
        $this->arg2 = $arg2;
    }

    public function echoArgOne
    {
        echo $this->arg1;
    }

}

PHP Yansımasını Kullanma;

$str = "One";
$className = "Class".$str;
$class = new \ReflectionClass($className);

Yeni bir Örnek oluşturun:

$instance = $class->newInstanceArgs(["Banana", "Apple")]);

Bir yöntemi çağırın:

$instance->echoArgOne();
//prints "Banana"

Bir değişkeni yöntem olarak kullanın:

$method = "echoArgOne";
$instance->$method();

//prints "Banana"

Yalnızca bir nesneyi oluşturmak için ham dizeyi kullanmak yerine Yansımayı kullanmak, nesneniz üzerinde daha iyi kontrol ve daha kolay test edilebilirlik sağlar (PHPUnit, Yansımayı büyük ölçüde kullanır)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.