匿名函数
当一个函数没有名字时,就是一个匿名函数。
匿名函数有三种应用场景:
1. 作为一个值来使用
$fun = function ($a, $b) { return $a + $b; }; echo $fun(3, 4);
2. 作为回调函数
这里以 排序函数为例:
$arr = [5,32,6,7,23,90]; usort($arr, function ($a, $b) { return $a - $b; }); print_r($arr);
3. 获取父作用域中变量
一般函数中访问外部变量需要使用 global ,但是匿名函数有其独特的语法
$name = 'zmx'; $sex = 23; $fas = function() use ($name,$sex) { return $sex; }; $fa = function() use ($name){ return $name; };
当匿名函数用于获取父作用域时,就形成了闭包。
//获取父函数中变量,就是闭包 function fun1() { $age = 19; // 看到这种函数中返回函数的形式一般就是 php的闭包 return function() use ($age) { return $age; }; } echo fun1()(); // 因为 fun1() 返回的是一个函数,所以需要再执行一次。
命名空间
命名空间是一种封装事物的方法,其实就是将 函数,类等东西一块包起来隔离起来,防止重名冲突。有点像计算机的文件目录,在同一个目录不能存在同名文件,但是不同目录下却能有同名文件,这个父目录其实就有点像命名空间,担任了隔离的动能。
只要记住:命名空间主要就是 解决 类/函数/常量之间的命名冲突的。
命名空间有两种:全局空间(默认空间)用 \ 表示 和 自定义空间
这里先创建两个php文件,分别使用不同命名空间
<?php namespace space1; function sum() { return '28'; }
<?php namespace space2; include __DIR__.'/space1.php'; function sum() { return 90; } // 默认调用当前命名空间的 sum; echo sum(); // \ 代表全局空间,默认空间,根空间, 如果当前命名空间是全局空间时,可以省略 //echo \sum(); //查找局部空间,默认是从当前空间开始查找 echo \space2\sum().'<br/>'; echo \space1\sum(); // 这样写会报错, 这里 其实是查找的 space2\space2\sum(); 找不到 // 只有从 根目录上开始查找能找到 sapce2 空间 echo space2\sum(); // 使用 namespace 指当前命名空间 echo namespace\sum();
注:命名空间的应用对象是 函数/常量/类/接口,因为这些是不允许重名的
类
类是实现代码封装和重用的机制。
1. 创建一个类
<?php namespace space4; class Phone { public $product = 'phone'; // php中属性是前要加上 访问控制 public $price = '200'; }
2. 将类实例化生成一个对象
$phone1 = new Phone();
3. 访问类中成员
echo $phone1->price; // 注意;访问类中属性时不需要加 $
类与对象是紧密联系的:
对象是类的实例,类是对象的模板。
( 比喻:类就像车间中的模具,对象就像用模具生产出来的模型 )
总结
匿名函数的使用场景:作为值调用,回调(用的比较多),访问父作用域变量。
命名空间其实是一种隔离机制,主要应用对象有: 函数/常量/类/接口,因为它们都是不允许重名的。
类既然是一种代码复用的手段,就说明就是用来多次使用的,是一个抽象的东西;对象就是经过 类 的实例化生产的出来的东西,是具体的,不要搞混了。