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实现的MySQL数据浏览器
Mar 11 PHP
如何在symfony中导出为CSV文件中的数据
Oct 06 PHP
php中使用$_REQUEST需要注意的一个问题
May 02 PHP
getimagesize获取图片尺寸实例
Nov 15 PHP
php数字每三位加逗号的功能函数
Oct 22 PHP
PHP模糊查询的实现方法(推荐)
Sep 06 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
Laravel学习基础之migrate的使用教程
Oct 11 PHP
PHP如何通过表单直接提交大文件详解
Jan 08 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
Oct 14 PHP
php查看一个变量的占用内存的实例代码
Mar 29 PHP
PHP数组访问常用方法解析
Sep 05 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判断远程url是否有效的几种方法小结
2011/10/08 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
2018/08/24 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
JS实现公告上线滚动效果
2021/01/10 Javascript
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
树莓派安装OpenCV3完整过程的实现
2019/10/10 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
Python with语句和过程抽取思想
2019/12/23 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
python连接mysql有哪些方法
2020/06/24 Python
Python模块常用四种安装方式
2020/10/20 Python
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
什么是封装
2013/03/26 面试题
路政管理专业推荐信
2013/11/11 职场文书
旷课检讨书2000字
2014/01/14 职场文书
客服部工作职责范本
2014/02/14 职场文书
本科毕业自我鉴定
2014/03/20 职场文书
物理学专业自荐信
2014/06/11 职场文书
房屋出租委托书格式
2014/09/23 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
机器人瓦力观后感
2015/06/12 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
如何理解及使用Python闭包
2021/06/01 Python