PHP __ method_exists vs diyoruz

4 Cevap php

The Project I'm working on contains something like a wrapper for call_user_func(_array) which does some checks before execution. One of those checks is method_exists (In Case the supplied first argument is an instance of a class and the second is a method name) The other is_callable. The function will throw an exception if one of those checks fails.

Benim Kod fonksiyonu adları (setFoo, setBar, vb) ve ayar kolları (__call) aşırı yükleme için php sihirli işlevi, değiştirilmesi ve bazı değişkenlerin silinmesi (daha bazı dizi elemanları) ile bir dizi içerir.

The Problem: method_exists will return false if the function is not defined.

__ Arama fonksiyonu isteği uygun taşıma yaparsa ben gerçek almak için herhangi bir şans var mı?

4 Cevap

__call yoktur yöntemleri aramaları yönetir. method_exists bir yöntem varlığını kontrol eden bir iç gözlem yöntemdir.

Nasıl __call bir yöntem işlemek için tespit edilebilir? Ben size isteği işlemek ve aksi kullanmak istiyorsunuz kod istisnayı yakalamak değilse __call elle bir istisna olduğunu düşünüyorum method_exists. BadMethodCallException , bu amaç için mevcuttur.

method_exists iki şey çalışır:

  • Sınıfın işlev tablosunda yöntem adı arar. Bu function foo() {} yazın yöntemlerdir.
  • Çekler sınıf (C kodu) bir (C kodu) get_method() fonksiyonu vardır ve eğer sınıf uygulaması karar için onu çağırmak varsa.

Sen ikincisi gerekiyordu. Ama bu get_method() yani get_method () bazı kullanıcı tanımlı php script kodunu aramak için hiçbir yolu yoktur, php script kodu "genişletilmiş" değildir (Ve ne olur bu php kod dönüş?).

Yani benim iyi bilgiye cevabı: (? Henüz) Hayır, bu mümkün değil.

Uygulanması ZEND_FUNCTION(method_exists) zend/zend_builtin_functions.c bulunabilir ve ben C ama PHP bilmiyorum bile oldukça okunabilir düşünüyorum edilir.

Belki method_exists sizin __call fonksiyon ve throw bir bir Exception bu başarısız ve şal gereken her şeyi {kullanmak için cazip olurdu [(4)]} catch yerine is_callable fonksiyonu kullanılarak blok.