首页 后端开发 php教程 PHP学习之深入理解is_callable()和method_exists()函数

PHP学习之深入理解is_callable()和method_exists()函数

Apr 25, 2019 pm 05:10 PM

本篇文章主要介绍了PHP中的is_callable()和method_exists()函数,具有很高的学习价值,感兴趣的朋友可以学习一下。

一、函数解析

is_callable()

定义:

(PHP 4 >= 4.0.6, PHP 5, PHP 7) 

is_callable — 检测参数是否为合法的可调用结构

bool is_callable ( callable $name [, bool $syntax_only = false [, string &$callable_name ]] )

验证变量的内容能否作为函数调用。 这可以检查包含有效函数名的变量,或者一个数组,包含了正确编码的对象以及函数名。

参数:

name

要检查的回调函数。

syntax_only

如果设置为 TRUE,这个函数仅仅验证 name 可能是函数或方法。 它仅仅拒绝非字符,或者未包含能用于回调函数的有效结构。有效的应该包含两个元素,第一个是一个对象或者字符,第二个元素是个字符。

callable_name

接受“可调用的名称”。下面的例子是“someClass::someMethod”。 注意,尽管 someClass::SomeMethod() 的含义是可调用的静态方法,但例子的情况并不是这样的。

返回值:

如果 name 可调用则返回 TRUE,否则返回 FALSE

参考文献: http://php.net/manual/zh/function.is-callable.php

二、函数测试

测试一:

echo &#39;<pre >&#39;;
$func = function ($a)
{
    echo $a;
};
$re = is_callable($func, true, $callable_name1);
echo &#39;<hr />&#39;;
$re1 = is_callable($func, false, $callable_name2);

//结果
bool(true)
string(17) "Closure::__invoke"
-------------------------------------
bool(true)
string(17) "Closure::__invoke"
登录后复制

测试结果:

对于匿名函数,传入函数变量后,参数二syntax_only true 和 false,打印结果是一样的。

测试二:

function c_b($d)
{
    echo $d;
}
$re = is_callable(&#39;c_b&#39;, false, $callable_name1);
$re1 = is_callable(&#39;c_b&#39;, true, $callable_name2);
var_dump($re);
echo &#39;<hr />&#39;;
var_dump($re1);
echo &#39;<hr />&#39;;
var_dump($callable_name1);
echo &#39;<hr />&#39;;
var_dump($callable_name2);
//结果
bool(true)
----------------
bool(true)
----------------
string(3) "c_b"
----------------
string(3) "c_b"
登录后复制

测试结果:

对于一般函数,传入函数名称后,参数二syntax_only true 和 false,打印结果是一样的。

测试三:

class Person
{
    public static function get($a)
    {
        echo $a;
    }

    protected function _set()
    {
        echo 1;
    }
}
$p = new Person();

$re = is_callable([$p, &#39;get&#39;], false, $callable_name1);
$re1 = is_callable([$p, &#39;get&#39;], true, $callable_name2);
var_dump($re);
echo &#39;<hr />&#39;;
var_dump($re1);
echo &#39;<hr />&#39;;
var_dump($callable_name1);
echo &#39;<hr />&#39;;
var_dump($callable_name2);
//结果
bool(true)
-----------------
bool(true)
-----------------
string(11) "Person::get"
---------------------------
string(11) "Person::get"
登录后复制

测试结果:

对于类的方法,参数以数组结构(类对象或类名称 + 方法名称),参数二syntax_only true 和 false,打印结果也是一样的。

测试四:

$a = &#39;i am string&#39;;
$re = is_callable($a, false, $callable_name1);
$re1 = is_callable($a, true, $callable_name2);
var_dump($re);
echo &#39;<hr />&#39;;
var_dump($re1);
echo &#39;<hr />&#39;;
var_dump($callable_name1);
echo &#39;<hr />&#39;;
var_dump($callable_name2);
//结果
bool(false)
----------------
bool(true)
----------------
string(11) "i am string"
-------------------------
string(11) "i am string"
登录后复制

测试结果:

对于传入的验证name,如果syntax_only 设置为true,它验证传入name是否是字符串,是否含有非法字符,如果不含有,则返回true,它并不会验证name是否为合法调用结构。

测试五:

$re = is_callable([&#39;Class&#39;, &#39;Method&#39;], false, $callable_name1);
$re1 = is_callable([&#39;Class&#39;, &#39;Method&#39;], true, $callable_name2);
var_dump($re);
echo &#39;<hr />&#39;;
var_dump($re1);
echo &#39;<hr />&#39;;
var_dump($callable_name1);
echo &#39;<hr />&#39;;
var_dump($callable_name2);
//结果
bool(false)
--------------
bool(true)
--------------
string(13) "Class::Method"
-----------------------------
string(13) "Class::Method"
登录后复制

测试结果:

对于传入的验证name,如果syntax_only 设置为true,它只验证传入name是否是字符串,是否含有非法字符或是否为数组参数字符串1 + 字符串二,如果符合条件,则返回true,它并不会验证name是否为合法调用结构。否者返回false;

测试六:

class Person
{
    public static function get($a)
    {
        echo $a;
    }

    protected function _set()
    {
        echo 1;
    }
}
$p = new Person();
$re = is_callable([$p, &#39;_set&#39;], false);
var_dump($re);
echo &#39;<hr />&#39;;
$re1 = method_exists($p, &#39;_set&#39;);
var_dump($re1);
//结果
bool(false)
------------
bool(true)
登录后复制

测试结果:

对于函数is_callable() 来说,如果验证的类方法,访问修饰符为protected或private 则返回false

对于method_exists() 来说,则不受访问修饰符的影响,只要类方法存在,则返回true。

 三、总结、

1、is_callable() 函数,可传入的name类型有:函数字符串,匿名函数变量,类或类对象和方法名称组成的数组。其函数第二参数,如果是true,则只验证name是否是字符串或则是类或字符串1(类对象)和字符串二(方法名称)组成的数组。而不验证name是否为合法调用结构。如果是false,则验证name是否为合法调用结构。

2、method_exists() 函数,不受访问修饰符的影响,只要类方法存在,则返回true。函数is_callable()来说,如果验证的类方法,访问修饰符为protected或private 则返回false。

 相关教程:PHP视频教程

以上是PHP学习之深入理解is_callable()和method_exists()函数的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在Laravel中使用Flash会话数据 在Laravel中使用Flash会话数据 Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

php中的卷曲:如何在REST API中使用PHP卷曲扩展 php中的卷曲:如何在REST API中使用PHP卷曲扩展 Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

简化的HTTP响应在Laravel测试中模拟了 简化的HTTP响应在Laravel测试中模拟了 Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12个最佳PHP聊天脚本 在Codecanyon上的12个最佳PHP聊天脚本 Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

解释PHP中晚期静态结合的概念。 解释PHP中晚期静态结合的概念。 Mar 21, 2025 pm 01:33 PM

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

自定义/扩展框架:如何添加自定义功能。 自定义/扩展框架:如何添加自定义功能。 Mar 28, 2025 pm 05:12 PM

本文讨论了将自定义功能添加到框架上,专注于理解体系结构,识别扩展点以及集成和调试的最佳实践。

框架安全功能:防止漏洞。 框架安全功能:防止漏洞。 Mar 28, 2025 pm 05:11 PM

文章讨论了框架中的基本安全功能,以防止漏洞,包括输入验证,身份验证和常规更新。

See all articles