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 相关文章推荐
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 PHP
PHP去除数组中重复的元素并按键名排序函数
Aug 18 PHP
php 破解防盗链图片函数
Dec 09 PHP
ajax在joomla中的原生态应用代码
Jul 19 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
Aug 22 PHP
php利用单例模式实现日志处理类库
Feb 10 PHP
php自动识别文件编码并转换为UTF-8的方法
Jun 12 PHP
PHP中ini_set与ini_get用法实例
Nov 04 PHP
php递归法读取目录及文件的方法
Jan 30 PHP
浅谈PHP中Stream(流)
Jun 08 PHP
php 流程控制switch的简单实例
Jun 07 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
Jun 10 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 文件上传进度条的两种实现方法的代码
2007/11/25 PHP
PHP+jquery实时显示网站在线人数的方法
2015/01/04 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
JavaScript 判断浏览器是否支持SVG的代码
2013/03/21 Javascript
百度移动版的url编码解码示例
2014/04/29 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
2016/09/29 Javascript
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
Vue的MVVM实现方法
2017/08/16 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
前端axios下载excel文件(二进制)的处理方法
2018/07/31 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
vue-router源码之history类的浅析
2019/05/21 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
pandas 空数据处理方法详解
2019/11/02 Python
python 模拟登录B站的示例代码
2020/12/15 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
学生生病请假条范文
2014/02/16 职场文书
节约电力资源的建议书
2014/03/12 职场文书
科技节口号
2014/06/19 职场文书
2015毕业生实习工作总结
2014/12/12 职场文书
个人事迹材料怎么写
2014/12/30 职场文书
初中教师个人工作总结
2015/02/10 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js
A22国内电台短波广播频率表
2022/05/10 无线电