call_user_func_array vs call_user_func

3 Cevap php

Bugün ilginç bir konuya rastladım. Biz Zend Altyapıları önbelleğe alma işlevselliği kullanan bir uygulama var. Bu uygulama için bir istek genellikle aşağıdaki satırı kullanarak bir fabrika yöntemini çağırır

$result =  call_user_func_array(array("myclass", "factory"), array($id));

Fikir daha sonra erişebilirsiniz fabrika yöntemi bir nesne döndürmektir. Biz önbelleğe alma özelliği uygulanan, bu çağrı sadece, iyi, ölür. Hiçbir hata, sadece beyaz bir ekran. Hata günlüğünde bir şey yok. Biz Tamam önce hattını hata günlüğü, ancak fabrika yöntemi içinde error_log çalışırken hiçbir şey yok edebilirsiniz.

Çizgi değişen, İlginçtir:

$result =  call_user_func(array("myclass", "factory"), $id);

sorunu giderir.

Biz hata raporları için etrafa birkaç saat geçirdim ve bu davranışı açıklamak için çok ile gelmedik. Düşünceler kimse?

3 Cevap

Ben bir-henüz-yüklü sınıf bir PHP komut ile çağrıldığında özdevinimli_yükle düzgün ateş değil __ aşağı geldi bu gibi sorunları vardı. Açıkça PHP komutundan önce sınıfını çağırarak bir satır sizin için çözer eğer bunun için aptal deneme yanılma başka bir strateji olarak bildiğim kadarıyla, sadece deneyin.

$dummy = new MyClassName;
call_user_func_array(array('MyClassName', 'method'), array($id));
unset($dummy);

Eğer php hangi sürümünü kullanıyorsunuz? Bir noktada ReflectionClass ile call_user_func_array birleştiren bir sorun vardı. Ben henüz sabit eğer emin değilim.

Bu segfaulting mı? (Herhangi bir sanal dışında) için 'root' apache günlükleri kontrol ve ne oluyor bakın. Bu konu segfaulting ise size PHP posta listeleri ve / veya hata izci olduğunu persue isteyebilirsiniz.

Alternatif olarak bir php debug-derleme ile, GDB, tek kullanıcı modunda http çalıştırmayı deneyin ve bunu yakalayabilir görmek, ama :-) bir sürü iş şu olabilir