可变函数

  PHP支持可变函数的概念。所以如果一个变量后面有圆括号“()”,PHP将寻找与变量值同名的函数,并尝试执行此函数,可变函数可以用来实现回调函数、函数列表等。可变函数不能用于echo、print、unset、isset、array等等类似的语言结构,需要使用自己的包装函数来将这些结构作为可变函数。可变函数还可以用于对象方法的调用。

<?php
function foo(){
    echo "foo\n";
}
function bar(){
    echo "bar\n";
}

$func="foo";
$func();
$func="bar";
$func();
$func="echo";
$func("echo");
?>

PHP5.4起,如果数组中为合法调用,则可以做为可变函数,用于调用类中方法时使用,数组长度必须为2,第一个值为类名或其他合法形式,第二值为要调用的方法名。PHP7.0起支持ClassName::methodName为可变函数。

<?php
class Foo
{
    static function bar()
    {
        echo "bar\n";
    }
    function baz()
    {
        echo "baz\n";
    }
}

$func = array("Foo","bar");
$func(); // prints "bar"
$func = array(new Foo, "baz");
$func(); // prints "baz"
$func = "Foo::bar";
$func(); // prints "bar" as of PHP 7.0.0; prior, it raised a fatal error
?>

内置函数
        PHP超全局变量PHP 有很多标准的函数和结构。还有一些函数需要和特定地 PHP 扩展模块一起编译,否则在使用它们的时候就会得到一个致命的“未定义函数”错误。有很多核心函数已包含在每个版本的 PHP 中如字符串和变量函数。调用 phpinfo() 或者 get_loaded_extensions() 可以得知 PHP 加载了那些扩展库。同时还应该注意,很多扩展库默认就是有效的。
        匿名函数
        匿名函数PHP5.3新增,也叫闭包函数,是一个临时创建的没有指定名称的函数,经常用做回调函数参数的值。匿名函数是通过闭包类Closure来实现的。PHP会自动把匿名函数转换为Closure对象的实例。把一个Closure对象赋值给一个变量与普通的变量赋值是一样的。通过使用use语言结构可以匿名函数可以从父作用域继承变量。继承变量有两种方式,一种是继承变量的值,一种是变量的引用。此外,匿名函数还可以接受普通的参数。匿名函数的父作用域是定义该匿名函数的函数。

<?php
$message = 'hello';
// 没有 "use"
$example = function () {
var_dump($message);
};
//值为null
$example();

// 使用"use" 继承 $message
$example = function () use ($message) {
var_dump($message);
};
//值为hello
$example();

$message = 'world';
//值传递,继承变量的值在方法定义时被确定,所以输出为hello
$example();

//引用传递
$example = function () use (&$message) {
var_dump($message);
};
//参数值的修改会传递到匿名函数内,所以输出为World
$message = 'World';
$example();
//
$example = function ($arg) use (&$message) {
var_dump($arg.$message);
};
$example("hello");
?>
        PHP5.4起,$this可在匿名函数中使用。
<?php
class Test
{
public function testing()
{
return function() {
var_dump($this);
};
}
}

$object = new Test;
$function = $object->testing();
$function();
?>

PHP7.1起,匿名函数继承的变量不能是超全局变量、$this以及与函数参数名同名的变量。
        静态匿名函数
        PHP5.4起,当在类的上下文中声明匿名函数,当前类会自动绑定到匿名函数,使$this变量在函数中可用,如果不想自动绑定当前类,就需要声明为静态匿名函数。

<?php
class Foo{
function foo(){
$func=static function(){
var_dump($this);
};
return $func();
}
}
$foo=new Foo;
$foo->$foo();

PHP学习日记 函数的更多相关文章

  1. python学习日记(函数基础)

    修改文件(原理)--回顾 #修改文件(原理) with open('name','r',encoding='utf-8') as f,\ open('password','w+',encoding=' ...

  2. android学习日记03--常用控件Dialog

    常用控件 9.Dialog 我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框 对话框,要创建对话框之前首先要创建Bui ...

  3. android学习日记03--常用控件button/imagebutton

    常用控件 控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者.方法则是控件的一些简单而可见的功能.所有控件都是继承View类 介绍android原生提供几种常用的控件bu ...

  4. SQL学习日记

    目录 SQL学习日记 1. 常见的数据库对象 2. DDL 定义语句 3. DML 操作语句 4. DQL 查询语句 5. DCL 控制语句 SQL学习日记 1. 常见的数据库对象 对象名 关键字 描 ...

  5. C++学习日记:关于我决定开始学习C++的那些事

    苦恼于Python运行时感人的速度,我决定学习C++. 为了激励我自己好好地学习这门未曾谋面的编程语言,我决定在此开设专栏:C++学习日记.希望在读者们的监督下,我可以早日掌握这门语言.当然,如果那位 ...

  6. Linux学习日记-使用EF6 Code First(四)

    一.在linux上使用EF 开发环境 VS2013+mono 3.10.0 +EF 6.1.0 先检测一下EF是不是6的 如果不是  请参阅 Linux学习日记-EF6的安装升级(三) 由于我的数据库 ...

  7. JavaScript学习09 函数本质及Function对象深入探索

    JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...

  8. android学习日记05--Activity间的跳转Intent实现

    Activity间的跳转 Android中的Activity就是Android应用与用户的接口,所以了解Activity间的跳转还是必要的.在 Android 中,不同的 Activity 实例可能运 ...

  9. android学习日记03--常用控件checkbox/radiobutton

    常用控件3.checkbox 复选框,确定是否勾选,点击一下勾选,点击第二下取消,当有一系列备选项时适合用checkbox控件,方便用户提交数据. 贴上例子Activity的java代码 packag ...

随机推荐

  1. IIS错误整理收集【持续更新】

    一.HTTP 错误 403.14 - Forbidden HTTP 错误 403.14 - Forbidden,Web 服务器被配置为不列出此目录的内容. 解决方案:修改程序池.NET Framewo ...

  2. 拟牛顿法/Quasi-Newton,DFP算法/Davidon-Fletcher-Powell,及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno

    拟牛顿法/Quasi-Newton,DFP算法/Davidon-Fletcher-Powell,及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno 转载须注明出处:htt ...

  3. 20155223 2016-2017-2 《Java程序设计》第7周学习总结

    20155223 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十二章 Lambdo表达式下,任何参数的类型必须标明清楚:如果有目标类型的话,在编译程序可 ...

  4. 27、增强for循环

    增强for循环 使用增强for循环可以简化数组和Collection集合的遍历,格式: for(元素数据类型 变量 : 数组或者Collection集合) { 使用变量即可,该变量就是元素 } 例: ...

  5. Ubuntu 问题汇总

    1..bashrc环境变量失效,ls.cp等命令不能使用了: export PATH=/usr/bin:/bin 2.添加环境变量 echo '********' >> ~/.bashrc ...

  6. boost 时间

    利用boost来获取当前时间又方便快捷,还不用考虑跨平台的问题. 1. 输出YYYYMMDD [cpp] view plaincopy #include <boost/date_time/gre ...

  7. VUE常用指令总结!

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. transparent 透明效果

    background-color:transparent;就是把背景色设置为透明. 实际上background默认的颜色就是透明的属性.所以写和不写都是一样的 span{ width: 0; heig ...

  9. web项目打包后在代码中获取资源文件

    在web项目里面,有时代码里面需要引用一些自定义的配置文件,这些配置文件如果放在类路径下,项目经过打包后使用的相对路径也会发生变化,所以以下给出了三种解决方案. 一.properties下配置 在类路 ...

  10. linux强制踢掉登录用户【转】

    [root@Wang ~]# w :: up :, users, load average: 0.71, 0.58, 0.57 USER TTY FROM LOGIN@ IDLE JCPU PCPU ...