博主信息
Victor的博客
博文
26
粉丝
0
评论
0
访问量
2812
积分:0
P豆:52

PHP-匿名函数-命名空间-类和对象1--2019年09月29日

2019年10月16日 02:17:01阅读数:215博客 / Victor的博客 / PHP

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();

?>
运行实例 »
点击 "运行实例" 按钮查看在线实例

运行结果如下:

namespace.jpg

总结:

1、基本掌握了匿名函数(闭包)的使用场景和方式;

2、初步掌握了命名空间的使用规则和场景;

3、练习类的声明、对象的实例化。

4、以上内容需要在后续学习中多加练习,直至熟练掌握。









批改状态:合格

老师批语:作业完成的质量不错

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
暂无评论暂无评论!