Rumah pembangunan bahagian belakang tutorial php 探究PHP中is_callable()与method_exists()函数

探究PHP中is_callable()与method_exists()函数

Sep 06, 2017 pm 04:24 PM
callable exists method

在很多产品应用中,我们经常能够看到以下这种用法,它用来检查一个对象里的方法是否存在。

<?php
    if (method_exists($object, &#39;SomeMethod&#39;)) {   
    $object->SomeMethod($this, TRUE); 
    }
?>
Salin selepas log masuk

这段代码的目的比较容易理解,有一个对象为$object,我们想知道它是否有一个方法为SomeMethod,如果有,就调用此方法。

这个代码看起来正确,而且在大部分的时候运行也会正常。但是如果这个$object对象的方法对于当前的运行环境是不可见的,程序还能正常运行吗?正如这个函数名方法存在一样,只是对我们提供的类或对象检查是否有我们所期望的方法,如果有,就返回TRUE,如果没有,就返回FALSE,这里并没有考虑可见性的问题。所以,当你恰好判断一个私有或者受保护的方法时,你能够得到一个正确的返回,但是执行的时候,会得到一个“Fatal Error”错误警告。

上面这段代码的真正意图应该理解为:对于提供的类或者对象,我们能否在当前的作用域中调用它的SomeMethod方法。而这正是is_callable()函数存在的目的。is_callable()函数接收一个回调参数,可以指定一个函数名称或者一个包含方法名和对象的数组,如果在当前作用域中可以执行,就返回TRUE。

<?php
    if (is_callable(array($object, &#39;SomeMethod&#39;))) {      
        $object->SomeMethod($this, TRUE); 
    }
?>
Salin selepas log masuk

下面来举个例子来说明两者的区别

<?phpclass Foo {
    public function PublicMethod(){}    
    private function PrivateMethod(){}    
    public static function PublicStaticMethod(){}    
    private static function PrivateStaticMethod(){}
}
    $foo = new Foo();$callbacks = array(    
    array($foo, &#39;PublicMethod&#39;),    
    array($foo, &#39;PrivateMethod&#39;),    
    array($foo, &#39;PublicStaticMethod&#39;),    
    array($foo, &#39;PrivateStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateStaticMethod&#39;),
   );
   foreach ($callbacks as $callback){
    var_dump($callback);
    var_dump(method_exists($callback[0], $callback[1]));
    var_dump(is_callable($callback));    
    echo str_repeat(&#39;-&#39;, 10);    
    echo &#39;<br />&#39;;
}
Salin selepas log masuk

执行上面的脚本后,我们会清晰地看到两个函数间的差别。

is_callable()还有其他的用法,例如,不检查所提供的类或方法,只检查函数或方法的语法是否正确。像method_exists()一样,is_callable()可以触发类的自动加载。

如果一个对象存在魔术方法__call,在进行方法判断时method_exists()会返回FALSE,而is_callable()会返回TRUE。

<?phpclass MethodTest {
    public function __call($name, $arguments){
      echo &#39;Calling object method &#39; . $name . &#39; &#39; .implode(&#39;, &#39;, $arguments);      
      echo &#39;<br />&#39;;
    }
}$obj = new MethodTest();$obj->runtest(&#39;in object context&#39;);
var_dump(method_exists($obj,&#39;runtest&#39;));
var_dump(is_callable(array($obj,&#39;runtest&#39;)));

echo &#39;<br />&#39;;
Salin selepas log masuk

运行结果

Calling object method runtest in object context
bool(false) bool(true)

图示

在很多产品应用中,我们经常能够看到以下这种用法,它用来检查一个对象里的方法是否存在。

<?phpif (method_exists($object, &#39;SomeMethod&#39;)) {   
    $object->SomeMethod($this, TRUE); 
}?>
Salin selepas log masuk

这段代码的目的比较容易理解,有一个对象为$object,我们想知道它是否有一个方法为SomeMethod,如果有,就调用此方法。

这个代码看起来正确,而且在大部分的时候运行也会正常。但是如果这个$object对象的方法对于当前的运行环境是不可见的,程序还能正常运行吗?正如这个函数名方法存在一样,只是对我们提供的类或对象检查是否有我们所期望的方法,如果有,就返回TRUE,如果没有,就返回FALSE,这里并没有考虑可见性的问题。所以,当你恰好判断一个私有或者受保护的方法时,你能够得到一个正确的返回,但是执行的时候,会得到一个“Fatal Error”错误警告。

上面这段代码的真正意图应该理解为:对于提供的类或者对象,我们能否在当前的作用域中调用它的SomeMethod方法。而这正是is_callable()函数存在的目的。is_callable()函数接收一个回调参数,可以指定一个函数名称或者一个包含方法名和对象的数组,如果在当前作用域中可以执行,就返回TRUE。

<?php
    if (is_callable(array($object, &#39;SomeMethod&#39;))) {      
    $object->SomeMethod($this, TRUE); 
    }
?>
Salin selepas log masuk

下面来举个例子来说明两者的区别

<?php
    class Foo {
    public function PublicMethod(){}    
    private function PrivateMethod(){}    
    public static function PublicStaticMethod(){}    
    private static function PrivateStaticMethod(){}
}
$foo = new Foo();$callbacks = array(    
    array($foo, &#39;PublicMethod&#39;),    
    array($foo, &#39;PrivateMethod&#39;),    
    array($foo, &#39;PublicStaticMethod&#39;),    
    array($foo, &#39;PrivateStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateStaticMethod&#39;),
   );
   foreach ($callbacks as $callback){
    var_dump($callback);
    var_dump(method_exists($callback[0], $callback[1]));
    var_dump(is_callable($callback));    
    echo str_repeat(&#39;-&#39;, 10);    
    echo &#39;<br />&#39;;
}
Salin selepas log masuk

执行上面的脚本后,我们会清晰地看到两个函数间的差别。

is_callable()还有其他的用法,例如,不检查所提供的类或方法,只检查函数或方法的语法是否正确。像method_exists()一样,is_callable()可以触发类的自动加载。

如果一个对象存在魔术方法__call,在进行方法判断时method_exists()会返回FALSE,而is_callable()会返回TRUE。

<?phpclass MethodTest {
    public function __call($name, $arguments){
      echo &#39;Calling object method &#39; . $name . &#39; &#39; .implode(&#39;, &#39;, $arguments);      
      echo &#39;<br />&#39;;
    }
}
$obj = new MethodTest();$obj->runtest(&#39;in object context&#39;);
var_dump(method_exists($obj,&#39;runtest&#39;));
var_dump(is_callable(array($obj,&#39;runtest&#39;)));
echo &#39;<br />&#39;;
Salin selepas log masuk

运行结果

Calling object method runtest in object context
bool(false) bool(true)

图示

Atas ialah kandungan terperinci 探究PHP中is_callable()与method_exists()函数 . Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Penyelesaian kepada ralat Fatal PHP: Panggilan ke fungsi ahli fetch() Penyelesaian kepada ralat Fatal PHP: Panggilan ke fungsi ahli fetch() Jun 23, 2023 am 09:36 AM

Apabila menggunakan PHP untuk pembangunan aplikasi web, anda selalunya perlu menggunakan pangkalan data. Apabila menggunakan pangkalan data, mesej ralat adalah sangat biasa. Antaranya, PHPFatalerror: Calltoamemberfunctionfetch() ialah ralat yang agak biasa berlaku apabila menggunakan PDO untuk menanyakan pangkalan data. Jadi, apa yang menyebabkan ralat ini dan bagaimana untuk menyelesaikannya? Artikel ini akan menerangkannya secara terperinci untuk anda. 1. Punca kesilapan

Prinsip dan senario penggunaan Disegerakkan dalam Java dan analisis penggunaan dan perbezaan antara muka Boleh Panggil Prinsip dan senario penggunaan Disegerakkan dalam Java dan analisis penggunaan dan perbezaan antara muka Boleh Panggil Apr 21, 2023 am 08:04 AM

1. Ciri asas 1. Ia bermula dengan kunci optimistik, dan jika konflik kunci kerap berlaku, ia ditukar kepada kunci pesimis 2. Ia bermula dengan pelaksanaan kunci ringan, dan jika kunci itu dipegang untuk masa yang lama, ia ditukar kepada kunci heavyweight 3. Strategi kunci putaran yang paling mungkin digunakan semasa melaksanakan kunci ringan 4. Ia adalah kunci tidak adil 5. Ia adalah kunci masuk semula 6. Ia bukan kunci baca-tulis 2. JVM akan menyegerakkan proses penguncian Kunci dibahagikan kepada tiada kunci, kunci berat sebelah, kunci ringan dan keadaan kunci berat. Ia akan dinaik taraf secara berurutan mengikut situasi. Kunci berat sebelah menganggap bahawa protagonis lelaki adalah kunci dan protagonis wanita adalah benang Jika hanya benang ini menggunakan kunci ini, maka protagonis lelaki dan protagonis wanita boleh hidup bahagia selama-lamanya walaupun mereka tidak mendapat sijil nikah (mengelakkan tinggi. -operasi kos). Tetapi peranan sokongan wanita muncul

Cara menggunakan fungsi File.Exists dalam C# untuk menentukan sama ada fail wujud Cara menggunakan fungsi File.Exists dalam C# untuk menentukan sama ada fail wujud Nov 18, 2023 am 11:25 AM

Cara menggunakan fungsi File.Exists dalam C# untuk menentukan sama ada fail wujud Dalam operasi fail C#, menentukan sama ada fail wujud ialah keperluan fungsian asas. Fungsi File.Exists ialah kaedah dalam C# yang digunakan untuk menentukan sama ada fail wujud. Artikel ini akan memperkenalkan cara menggunakan fungsi File.Exists dalam C# untuk menentukan sama ada fail wujud dan memberikan contoh kod khusus. Rujuk ruang nama Sebelum anda mula menulis kod, anda perlu merujuk ruang nama System.IO terlebih dahulu, yang

Bagaimana untuk menggunakan kaedah permintaan POST dalam jQuery Bagaimana untuk menggunakan kaedah permintaan POST dalam jQuery Feb 28, 2024 pm 09:03 PM

Cara menggunakan kaedah permintaan POST dalam jQuery Dalam pembangunan web, interaksi data antara halaman hadapan dan pelayan hujung belakang sering terlibat. Antaranya, permintaan POST ialah kaedah yang biasa digunakan Melalui permintaan POST, anda boleh menyerahkan data ke pelayan bahagian belakang dan mendapatkan hasil pulangan yang sepadan. jQuery ialah perpustakaan JavaScript popular yang menyediakan cara mudah untuk membuat permintaan AJAX Artikel ini akan memperkenalkan cara menggunakan kaedah POST dalam jQuery untuk penghantaran data dan memberikan arahan khusus.

Ralat PHP: gunakan null sebagai penyelesaian yang boleh dipanggil! Ralat PHP: gunakan null sebagai penyelesaian yang boleh dipanggil! Aug 19, 2023 pm 05:01 PM

Ralat PHP: gunakan null sebagai penyelesaian yang boleh dipanggil! Semasa proses pembangunan PHP, kami sering menghadapi beberapa mesej ralat Salah satu ralat biasa ialah "menggunakan null sebagai boleh dipanggil". Mesej ralat ini menunjukkan bahawa apabila memanggil objek boleh dipanggil, parameter melepasi nilai nol, menyebabkan operasi yang sepadan tidak dapat dilakukan. Ralat ini biasanya berlaku apabila memanggil fungsi panggil balik, kaedah atau contoh kelas, dan kita perlu menghantar objek boleh dipanggil sebagai parameter dengan betul. Berikut ialah beberapa contoh kod biasa:

Bagaimana untuk melaksanakan antara muka Boleh Panggil untuk mencipta kelas benang dalam java Bagaimana untuk melaksanakan antara muka Boleh Panggil untuk mencipta kelas benang dalam java May 11, 2023 am 11:58 AM

Melaksanakan antara muka Boleh Panggil untuk mencipta kelas benang telah menyediakan antara muka Boleh Panggil sejak Java 5. Antara muka ini ialah versi antara muka Boleh Panggil yang dipertingkatkan menyediakan kaedah panggilan() seperti yang boleh dilakukan oleh kaedah panggilan(). mempunyai nilai pulangan Kaedah panggilan() Pengecualian boleh diisytiharkan. booleancancel(booleanmay) cuba membatalkan tugas Boleh Panggil yang dikaitkan dengan Masa Depan. Vget() mengembalikan nilai pulangan kaedah panggilan() dalam tugasan Panggilan. Memanggil kaedah ini akan menyebabkan utas tersekat dan anda mesti menunggu sehingga utas anak tamat sebelum mendapat nilai pulangan. Vget(lama tamat,Ti

Cara menggunakan antara muka Boleh Panggil java Cara menggunakan antara muka Boleh Panggil java Apr 19, 2023 am 09:58 AM

Nota 1. Antara muka Boleh Panggil boleh mengembalikan hasil atau membuang tugas pengecualian, dan pelaksana boleh menentukan kaedah panggilan tanpa parameter. 2. Berbeza daripada kaedah run Thread dan Runnable, kaedah pelaksanaan tugas Callable ialah panggilan. call() boleh mengembalikan nilai, tetapi kaedah run() tidak boleh. call() boleh membuang pengecualian yang diperiksa, seperti ClassNotFoundException, tetapi run() tidak boleh membuang pengecualian yang diperiksa. Instance classMyCallableimplementsCallable{MyCallable(){}@OverridepublicInteger

Menggunakan fungsi EXISTS dalam MYSQL Menggunakan fungsi EXISTS dalam MYSQL Feb 24, 2024 pm 05:15 PM

Penggunaan EXISTS dalam MYSQL, dengan contoh kod Dalam pangkalan data MYSQL, EXISTS ialah pengendali yang sangat berguna, digunakan untuk menentukan sama ada subkueri mengembalikan sekurang-kurangnya satu baris data. Ia biasanya digunakan dengan klausa WHERE untuk menapis data yang memenuhi syarat berdasarkan hasil subkueri. Apabila menggunakan EXISTS, anda perlu memberi perhatian kepada perkara berikut: Keadaan EXISTS tidak mengambil berat tentang data khusus yang dikembalikan oleh subquery, hanya sama ada terdapat data yang dikembalikan. Keadaan EXISTS boleh digunakan dalam kombinasi dengan keadaan lain.

See all articles