9月29日
1. 自写案例演示匿名函数的三个应用场景
2. 深刻理解全名空间的意义,并实例演示多个命名空间的场景
3. 实例演示类与对象的关系与使用方式
4. 总结命名空间的应用对象, 适用场景以及注意事项
【1】匿名函数(Anonymous function)又叫做闭包函数(closures),它是一个没有指定名称的函数。
主要的应用场景有:
作为变量的值来使用;
作为回调函数来使用;
作为闭包函数来使用。
实例 --- 作为变量的值来使用 <?php $age = function ($a_age) {return ($a_age >= 40) ? ($a_age - 10) : $age;}; echo "显示年龄为:" . $age(45) . "岁。"; ?> 运行实例 » 点击 "运行实例" 按钮查看在线实例
实例 --- 作为回调函数来使用 <?php $array = [1, 2, 3, 4, 5, 6]; $EvenArray = array_filter($array, function ($value) { return ($value % 2 == 0) ? true : false; }); echo '<pre>' . print_r($EvenArray, true); ?> 运行实例 » 点击 "运行实例" 按钮查看在线实例
实例 --- 作为闭包函数来使用 <?php $func = function ($foo) {return function ($clousures) use ($foo) {return $foo . $clousures;};}; echo $func('匿名函数 -- ')('闭包的应用场景。'); ?> 运行实例 » 点击 "运行实例" 按钮查看在线实例
闭包函数可以从父作用域继承变量,如同类中的成员方法使用其成员属性。
use引用的是变量的副本,如果要完全引用,需要在变量前加&。
【2、3、4】PHP中的函数、类(接口)、常量,在同一次运行时是不允许重复的,默认情况下,它们都放在一个全局空间下,为了解决命名重复时不发生冲突,需要使用namespace来声明不同的命名空间,从而把代码划分出不同的区域,各个区域内重复的名字不会相互影响。
一般每个独立的文件只定义一个命名空间。在相同的空间内可以直接调用自己空间下的任何元素,而调用其他空间的元素,需要使用命名空间的语法。
命名空间划分为:
非限定名称:不包含前缀的名称;
限定名称:包含前缀,但不包含“\”;
完全限定名称:包含“\”的全局前缀。
别名和导入是调用命名空间元素的一种快捷方式。它可以用来为命名空间名称 或 类/函数/常量 使用别名,别名是通过use操作符来实现的,导入方式为:use cn\php as phpcn
namespace和__NAMESPACE__都表示当前空间名称,后者可以实现字符串形式的动态调用方式。
声明命名空间时,namespace必须是第一个PHP指令(declare除外)。
为了正确区分元素所在区域,建议调用时加上“\”。
在以下代码中演示了多命名空间的场景、演示了类和对象的实例化和使用方法。
glob.php --- 全局空间
blog.php --- Blog命名空间
comment.php --- Blog下的Comment子空间
Article.php --- Blog下的Aricle子空间
实例 --- Blog命名空间 <?php namespace Blog; require "glob.php"; require "article.php"; require "Comment.php"; const PATH = "blog"; class Comment { public function post() { echo "我在 " . PATH . " 里发表评论" . "<br>"; } } class Article { public function write() { echo "我在 " . __NAMESPACE__ . " 里写文章" . "<br>"; } } echo "【Blog】中使用本空间内的comment类和article类:" . "<br>"; $comment = new Comment(); $article = new Article(); $comment->post(); $article->write(); echo "<hr>"; echo "【Blog】中使用【Article】空间内的count类和article类:" . "<br>"; $count = new Article\Count(); $article = new Article\Article(); $count->getCount(); $article->write(); echo "<hr>"; echo "【Blog】中使用【Comment】空间内的count类和comment类:" . "<br>"; use Blog\Comment\Count as ct; $ct = new ct(); $ct->getCount(); use Blog\Comment\Comment as cc; $comment = new cc(); $comment->post(); echo "<hr>"; echo "【Blog】中使用【全局】空间内的getIP函数和Find类:" . "<br>"; $find = new \Find(); $find->ShowMe(); \getIP(); echo "<hr>"; ?> 运行实例 » 点击 "运行实例" 按钮查看在线实例
实例 --- 全局空间 <?php const PATH = '全局命名空间'; function getIP() { echo "我在 " . \PATH . " 里获取IP地址" . "<br>"; } class Find { public function ShowMe() { echo "执行了 " . \PATH . " 里的ShowMe()" . "<br>"; } } // echo \getIP(); // $find = new Find(); // $find->ShowMe(); // echo "【全局空间】中使用【Blog】空间内的comment类和【Blog\Article】空间的article类:" . "<br>"; // require "blog.php"; // $comment = new \Blog\Comment(); // require "article.php"; // use Blog\Article\Article; // $article = new Article(); // $comment->post(); // $article->write(); // echo "<hr>"; ?> 运行实例 » 点击 "运行实例" 按钮查看在线实例
实例 --- Blog下的Comment子空间 <?php namespace Blog\Comment; const PATH = 'blog/comment'; function getCommentPath() { return PATH; } class Comment { public function post() { echo "我在 " . PATH . " 里发表评论" . "<br>"; } } class Count { public function getCount() { echo "统计 " . __NAMESPACE__ . " 里评论的数量" . "<br>"; } } // \getIP(); // $article = new \Blog\Article\Article(); // $article->write(); // $comment = new Comment(); // $article = new Article(); // $comment->post(); // $article->write(); ?> 运行实例 » 点击 "运行实例" 按钮查看在线实例
实例 --- Blog下的Aricle子空间 <?php namespace Blog\Article; const PATH = "blog/article"; function getArticlePath() { return PATH; } class Article { public function write() { echo "我在 " . PATH . " 里写文章" . "<br>"; } } class Count { public function getCount() { echo "统计 " . __NAMESPACE__ . " 里文章的数量" . "<br>"; } } // $article = new Article(); // $article->write(); ?> 运行实例 » 点击 "运行实例" 按钮查看在线实例
运行结果如下:
总结:
1、基本掌握了匿名函数(闭包)的使用场景和方式;
2、初步掌握了命名空间的使用规则和场景;
3、练习类的声明、对象的实例化。
4、以上内容需要在后续学习中多加练习,直至熟练掌握。