PHP函数常用用法小结


Posted in PHP onFebruary 08, 2010

魔术函数

 

魔术函数是PHP中内置的语言特性,当程序执行到某种情况时,如果定义了这些魔术函数(php手册中称之为“Overloading),则PHP会调用他们,同时也会传入相应的参数,可以认为是PHP执行过程中的钩子函数。常见的魔术函数有__construct, __destruct , __call, __get, __set, __isset, __unset __sleep, __wakeup, __toString, __clone 以及__autoload 。它们 可以用来自动加载包含文件,实现延迟执行(类似于.Net中的属性访问器)、垃圾回收、对象clone等操作,举个__autoload的例子,其他魔术函数参见 Magic Method

 

__autoload($class_name):用来自动加载包含文件,省得includerequire,对性能有一定影响,但一般情况下可忽略。

 

下面是一个简单的例子

function __autoload($class_name)  

{

    require_once $class_name . '.class.php';

}

把它放入common.php等全局包含文件中,当新建一个对象时,比如 $obj=new Class_A,如果php无法找到Class_A,则会把"Class_A" 作为参数$class_name,执行 __autoload函数。这样就可以达到自动包含头文件的目的了。

 

另外附赠几个常量和函数:

__FILE__ :魔术常量,获取当前源代码文件的路径(含文件名)

__CLASS__:魔术常量,获取当前类的类名(区分大小写的)。

array get_included_files ( void ):内置函数,返回通过include(), include_once(), require() require_once()包含的文件列表,但不包括通过php.ini配置文件中所设置的auto_prepend_file项。另外get_required_files()只是get_included_files ( void )的别名。

string dirname ( string path ):返回路径中的目录部分。

 

匿名函数

 

PHP5.3以前使用匿名函数,可以通过create_function()来创建匿名函数,

$func=create_function('$a,$b', '

if ($a == $b)

{

        return 0;

}

 return ($a< $b) ? -1 : 1;

');

PHP5.3中,可以直接使用lamda表达式

$func=function($a,$b)

{

if ($a == $b)

{

        return 0;

}

 return ($a< $b) ? -1 : 1;

}

然后可以作为参数传入其他函数,如:usort($arr,$func); 也可以直接调用,$func(3,4);

 

PHP5.3中使用闭包

function foo($arg1)

{

$var=3;

$inner=function($innerArg) use($arg1,$var)

{

   return $innerArg+$arg1/$var;

};

echo $inner(5);

}

闭包被当成一个内置类,但是没有javascript那么灵活,这个类不能有属性。$inner->a=5;是非法的。

 

嵌套函数

 

嵌套函数可以在父函数体里面定义函数,如:

function outer()

{

    $out_var=1;

    function inner()

    {

        var_dump($out_var);//输出NULL,无法访问到$out_var,声明global也不行,$out_var不是全局变量

        echo "call inner\n";

    }

    //echo "call outer\n";

 

    inner();//如果不调用inner(),则在访问outer()时也不会被调用

}

 

outer();

inner();//虽然,函数是全局的,必须先调用outer(),否则inner()调用会报错(函数未定义)

 

条件函数

 

$debug=false;

if($debug===true)

{

    function foo()

    {

        echo "foo";

    }

}

 

foo();

 

相当于条件编译了,从这里我们可以猜测到,为什么上文中outer()调用之前,inner()是无法调用的。因为innerouter()调用之前还未被“编译”(只是猜测,未深入研究)。

 

 

函数动态调用

 

函数名可以是变量名。

function foo()

{

echo "call foo";

}

$func='foo';

$func();

此方式比较危险,建议使用白名单方式将可用的函数名写在配置文件中,或者函数名都有统一前缀,比如$func="act_".$funcName;。另外在调用之前可用function_exists ($funcName)来检查函数是否存在。

 

通过内置函数调用函数,call_user_func(callback function ,[, mixed parameter [, mixed ...]] ),对于不确定的函数名,确定的参数可以使用此函数调用,如果参数也不确定可以通过call_user_func_array( callback function, array param_arr )

另外,可以通过get_defined_functions()来获取所有已定义的函数(注意是所有,包括内置函数)

 

调用类的方法则传入一个数组作为参数,此数组第一个元素是实例或类名,第二个元素是方法名:

class myclass

{

    public $age=21;

 

    function echo_age()

    {

        echo $this->age;

    }

    static function s_echo_age()

    {

        echo 22;

    }

    function i_echo_age()

    {

        echo 23;

    }

}

$c=new myclass;

$classname = "myclass";

//调用实例方法,如果call_user_func(array($classname , 'echo_age'));则会报错,$this未指向任何实例

call_user_func(array($c, 'echo_age'));

echo "\n";

//调用实例方法,如果没有引用$this变量,则不会有问题

call_user_func(array($classname, 'i_echo_age'));

echo "\n";

//调用静态方法,传入类名或实例均可

call_user_func(array($classname, 's_echo_age'));

echo "\n";

call_user_func(array($c, 's_echo_age'));

 

 

获取函数参数

 

通过此方式可以实现非常灵活的重载,但容易使逻辑变得负责,适度使用。

func_get_arg ( int arg_num )获取第arg_num个参数(从0开始计数)

func_num_args()获取参数总个数

func_get_args()获取所有参数。

 

用三行代码实现Gof中的一个设计模式:

function call_it($func)

{

$args=func_get_args();

array_shift($args);//去掉第一个参数,那是函数名

call_user_func_array($func,$args);

}

 

function add($a,$b)

{

    echo $a+$b;

}

function sqr($a)

{

    echo $a*$a;

}

call_it('add',1,2);

echo "\n";

call_it('sqr',2);

PHP 相关文章推荐
PHP自动生成月历代码
Oct 09 PHP
vBulletin Forum 2.3.xx SQL Injection
Oct 09 PHP
用php+javascript实现二级级联菜单的制作
May 06 PHP
PHP 日,周,月点击排行统计
Jan 11 PHP
php将session放入memcached的设置方法
Feb 14 PHP
php中require和require_once的区别说明
Feb 27 PHP
PHP判断表单复选框选中状态完整例子
Jun 24 PHP
浅析Yii2 gridview实现批量删除教程
Apr 22 PHP
php实现的读取CSV文件函数示例
Feb 07 PHP
Laravel第三方包报class not found的解决方法
Oct 13 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 PHP
PHP xpath提取网页数据内容代码解析
Jul 16 PHP
在PHP中养成7个面向对象的好习惯
Jan 28 #PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 #PHP
php读取xml实例代码
Jan 28 #PHP
通过具体程序来理解PHP里面的抽象类
Jan 28 #PHP
认识并使用PHP超级全局变量
Jan 26 #PHP
php 静态变量与自定义常量的使用方法
Jan 26 #PHP
php学习之 认清变量的作用范围
Jan 26 #PHP
You might like
PHP脚本的10个技巧(6)
2006/10/09 PHP
15种PHP Encoder的比较
2007/04/17 PHP
浅析PHP编程中10个最常见的错误
2014/08/08 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
2014/10/24 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
2018/03/12 PHP
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
Javascript变量的作用域和作用域链详解
2015/04/02 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
Angularjs处理页面闪烁的解决方法
2017/03/09 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
新手vue构建单页面应用实例代码
2017/09/18 Javascript
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
详解vue-router 初始化时做了什么
2018/06/11 Javascript
Vue中props的使用详解
2018/06/15 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
Vue+Spring Boot简单用户登录(附Demo)
2020/11/12 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
日本食品网上商店:JaponShop.com
2017/11/28 全球购物
航海技术专业毕业生求职信
2014/04/06 职场文书
继承权公证书
2014/04/09 职场文书
离婚被告答辩状
2015/05/22 职场文书
2019经典广告词集锦!
2019/07/02 职场文书