Bir veya birçok argümanlar ile yeni bir PHP sınıfı başlatmasını

4 Cevap

Ben bu getirme işlevi vardır:

public static function fetch($class, $key)
{
    try
    {
        $obj = new $class($key);
    }
    catch(Exception $e)
    {
        return false;
    }
    return $obj;
}

O sınıfın yapıcı arama ve anahtarı geçirerek yeni bir örneğini oluşturur. Şimdi, nasıl bu kadar ben $ anahtarının argümanların bir dizi geçmek ve bu gibi olabilir yapacak:

$obj = new $class($key[0], $key[1]...);

Bir veya daha fazla anahtar için çalışır böylece?

Umarım yeterince açık oldu.

PHP 5 kullanıyorum

4 Cevap

Bu ilginç bir soru. Bir yapıcı işlevi değilse o zaman normalde kullanabilirsiniz, dinamik argümanlar vermeye çalışıyorlardı call_user_func_array(). new operatörü katılır Ancak, bunu yapmak için zarif bir yol olarak görünmüyor.

Yansıma bulabildiğim ne uzlaşma gibi görünüyor. Aşağıdaki kod parçası call_user_func_array() üzerindeki kullanıcı yorumlarıyla alınan ve oldukça güzel kullanımını gösterir,:

<?php

// arguments you wish to pass to constructor of new object
$args = array('a', 'b');

// class name of new object
$className = 'myCommand';

// make a reflection object
$reflectionObj = new ReflectionClass($className);

// use Reflection to create a new instance, using the $args
$command = $reflectionObj->newInstanceArgs($args);

// this is the same as: new myCommand('a', 'b');
?>

Davanız için o kadar kısaltmak için kullanabilirsiniz:

$reflectionObject = new ReflectionClass($class);
$obj = $reflectionObject->newInstanceArgs($key);

Kullan reflection:

$classReflection = new ReflectionClass($class);
$obj = $classReflection->newInstanceArgs($key);

Benim library Bu çözer this:

// Returns a new instance of a `$classNameOrObj`.
function fuNew($classNameOrObj, $constructionParams = array()) {
    $class = new ReflectionClass($classNameOrObj);
    if (empty($constructionParams)) { return $class->newInstance(); }
    return $class->newInstanceArgs($constructionParams); }

Bunu aptalca bir dizi boş, verirseniz newInstanceArgs() şikayet edecektir, çünkü empty() testi gereklidir.

Sınıfının yapıcı neye benziyor? Bu argümanların rastgele bir sayı kabul ediyor mu? Bunun yerine anahtar argümanlar listesi tuşları bir dizi kabul etmek daha iyi olabilir.

call_user_func_array muhtemelen ne istediğinizi yapabilirsiniz:

$obj = new $object_class();
call_user_func_array(array($obj, '__construct'), $args);

Bu olumsuz yan etkileri olabilir, hangi iki kurucuyu çağıran unutmayın.