PHP bir __ construct yöntemi ile bir nesne ile call_user_func_array nasıl kullanılır

2 Cevap php

Nasıl (bazı isteğe bağlı değil argümanlar ile) __construct yöntemi ile yeni bir nesne oluşturmak için call_func_array kullanabilirsiniz.

İşte kod:

$urls = array(
    'view' => array(
        'view/(\d+)',
        array('controller' => 'test', 'action' => 'view'),
        array(1 => 'id'),
    ),
);

foreach ($urls as $name => $args) {
  $route = call_user_func_array(Zend_Controller_Router_Route_Regex, $args);
  $router->addRoute($name, $route);
}

2 Cevap

Kurucu için imzadır

($route, [ $defaults = array()], [ $map = array()], [ $reverse = null])

Böylece, boş argümanlarla bir dizi var, ve döngü her yönlendirici için gerçek argümanlar ile bu birleştirme olacaktır. Eğer basit, sadece son seçenek belirtmek yapmak istiyorsanız, o zaman config dizi dize tuşlarını kullanın ve varsayılan dizi.

$blank_opts = array('', array(), array(), null); //default options and blank route

foreach ($urls as $name => $args) {
  //replaces default options with options from the array, if set
  $opts = array_replace($blank_opts, $args);
  //create the new router
  $route = new Zend_Controller_Router_Route_Regex($opts[0], $opts[1], $opts[2], $opts[3]);
  $router->addRoute($name, $route);
}

Biri için, (bir dize olması gerekir Zend_Controller_Router_Route_Regex gibi bir yazım hatası var gibi görünüyor.

Böylece, bu işe yarayacağını düşünebiliriz:

$route = call_user_func_array(array('Zend_Controller_Router_Route_Regex', '__construct'), $args);

Herhangi bir yöntemle için statik bir sınıf yöntemi veya sınıfının bir örneğini çağrılırken Ancak, bildiğim kadarıyla, dizinin (ilk parametre) ilk elemanı ya bir dize olabilir. Ne durumda burada. Böylece, sadece bu şekilde yapardı:

$route = new Zend_Controller_Router_Route_Regex;
call_user_func_array(array('Zend_Controller_Router_Route_Regex', 'setOptions'), $args);

Yerine $args bu değişkenin türüne bağlı olarak array($args) kullanmak gerekebilir.

EDIT Hayır, yanılmıyorum. Yolları için setOptions() işlevi yoktur. Sana bir şey kontrol edelim ...

Ben PHP manual regarding call_user_func_array() bulundu EDIT2 Oldukça çirkin kesmek aşağıdadır:

$route = new Zend_Controller_Router_Route_Regex;
call_user_func_array(array($route, '__construct'), $args);

Ancak, ben bu test etmedi ve (hiç işe eğer) o (kendisine geçirilen herhangi bir parametre kabul ediyor mu? Sadece kurulum sınıfı veya başka şeyler yapılır mı kurucu uygulanmasına bağlı olarak işe yaramayabilir çok?). O amele olmadığını söyle ...