2009-12-07 12 views
10

Başka bir sınıfın örneğinde argümanları olan bir sınıfı başlatmam gereken durumlarda yaşıyorum. i argümanlar geçerken Test sınıfının bir örneğini oluşturmaya çalıştığınızda ŞimdiPHP: Başka bir sınıfın içinden argümanlarla bir sınıf nasıl oluşturulur

class myclass 
{ 
function cls($file_name, $args = array()) 
{ 
    include $file_name . ".php"; 

    if (isset($args)) 
    { 
     // this is where the problem might be, i need to pass as many arguments as test class has. 
     $class_instance = new $file_name($args); 
    } 
    else 
    { 
     $class_instance = new $file_name(); 
    } 

    return $class_instance; 
} 
} 

: i sınıfının cls'ye altında işlevini kullanarak sınıfın üzerindeki örneğini gerek Şimdi

//test.php 

class test 
{ 
    function __construct($a, $b, $c) 
    { 
     echo $a . '<br />'; 
     echo $b . '<br />'; 
     echo $c . '<br />'; 
    } 
} 

: İşte prototipidir o kadar:

$myclass = new myclass; 
$test = $myclass->cls('test', array('a1', 'b2', 'c3')); 

o verir hatası: Eksik argüman 1 ve 2; sadece ilk argüman geçer.

Bu, yapıcı işlevinde bağımsız değişkenleri olmayan bir sınıfı başlatıyorsa iyi çalışır.

Tecrübeli PHP geliştiricileri için, yukarıda bir çok sorun olmamalıdır. Lütfen yardım et.

Teşekkür

yapabilirsiniz
+0

Sorunuzla ilgili değil, ancak işlev tanımında array() öğesini atadığınızdan $ args her zaman "isset" olacaktır. "Empty" veya "$ args = null" ile ilgileniyor olabilirsiniz. – Tordek

+0

Üzgünüm, bu aynı zamanda sorunuzla da alakalı değil, ama ne yaptığınız güzel değil. sorunuzun cevabı: yapıcınızın bir dizi almasına, bazı sınıf özelliklerine sahip olmasına izin verin, ardından diziyi işleyin ve onu sınıf öznitelikleriyle eşleştirin. Ama yine de, havalı olmayan bir şey yapıyorsun. – DarthVader

+0

test sınıfı ve diğerleri, diğer geliştiriciler tarafından argümanlarla ve onsuz kendi yollarını kullanarak yapılmalıdır, bu yüzden bunları sadece argümanları kurucu olarak diziler halinde geçirmek için kısıtlamak istemiyorum. – Sarfraz

cevap

28

Eğer yansıma http://php.net/manual/en/class.reflectionclass.php

if(count($args) == 0) 
    $obj = new $className; 
else { 
    $r = new ReflectionClass($className); 
    $obj = $r->newInstanceArgs($args); 
} 
+0

Stereofrog'un sahip olduğu bilgiden gerçekten çok etkilendim çünkü çoğu insan yansıma sınıfını bile bilmiyor ve yansıma sınıfını bu yoldan geçmek için kullanabileceğimizi bilmiyordum. Sorunumu çözdüm, birçok gün için çözümü bulamadım. En deneyimli geliştiriciler bile çok önemli olan soruma tatmin edici bir cevap veremediler ve buradaki herkes bu soru senaryosuna bakmalı. Her neyse, bu çok önemli soruna bir çözüm bulmaktan çok mutluyum. Teşekkürler stereofrog :) – Sarfraz

+1

Yansımasız bir temel çözüm arıyordum, ama buna başvurmak zorunda kaldım. Kahretsin. – yclian

4

:

1) geçmek isteyen verileri içeren bir dize, kabul test sınıfını değiştirin.

//test.php 

class test 
{ 
     function __construct($a) 
     { 
       echo $a[0] . '<br />'; 
       echo $a[1] . '<br />'; 
       echo $a[2] . '<br />'; 
     } 
} 

2), bir kullanıcı yerine yöntem yapıcısı kullanılarak başlatmak ve call_user_func_array() fonksiyonunu kullanarak diyoruz. ana sınıfta

//test.php 

class test 
{ 
     function __construct() 
     { 

     } 

     public function init($a, $b, $c){ 
       echo $a . '<br />'; 
       echo $b . '<br />'; 
       echo $c . '<br />'; 
     } 

} 

:

class myclass 
{ 
function cls($file_name, $args = array()) 
{ 
     include $file_name . ".php"; 

     if (isset($args)) 
     { 
       // this is where the problem might be, i need to pass as many arguments as test class has. 
       $class_instance = new $file_name($args); 
       call_user_func_array(array($class_instance,'init'), $args); 
     } 
     else 
     { 
       $class_instance = new $file_name(); 
     } 

     return $class_instance; 
} 
} 

http://www.php.net/manual/en/function.call-user-func-array.php

Son olarak, lütfen yapıcı boş params bırakın ve func_get_args() kullanabilirsiniz.

//test.php 

class test 
{ 
     function __construct() 
     { 
       $a = func_get_args(); 
       echo $a[0] . '<br />'; 
       echo $a[1] . '<br />'; 
       echo $a[2] . '<br />'; 
     } 
} 

http://sg.php.net/manual/en/function.func-get-args.php

1

Sen inanıyorum call_user_func_array() kullanabilirsiniz.

veya = new textProperty ($ yapıcı argümanları listesini bırakın ve sonra kurucu içinde bu

$args = func_get_args(); 
+0

Bu cevabın ilk kısmı kurucunun çağrılmasına yardımcı olur; İkinci kısım, bu derste ara yüzün daha güzel olmasını sağlamaya yardımcı olabilir (sadece bir dizide sarmak yerine argümanları iletebilirsiniz). – Tordek

1
class textProperty 
{ 
    public $start; 
    public $end; 
    function textProperty($start, $end) 
    { 
     $this->start = $start; 
     $this->end = $end; 
    } 

} 

$ nesneye ihtiyacınız kullanabilirsiniz başlangıç, $ end);

çalışmıyor mu?

0

buldum kolay yolu:

if ($depCount === 0) { 
      $instance = new $clazz(); 
     } elseif ($depCount === 1) { 
      $instance = new $clazz($depInstances[0]); 
     } elseif ($depCount === 2) { 
      $instance = new $clazz($depInstances[0], $depInstances[1]); 
     } elseif ($depCount === 3) { 
      $instance = new $clazz($depInstances[0], $depInstances[1], $depInstances[2]); 
     } 

Maalesef biraz çiğ, ancak fikri anlamalıdır.

İlgili konular