博客列表 >匿名函数命名空间的应用场景,演示类与对象的关系与使用方式—2019年9月29日

匿名函数命名空间的应用场景,演示类与对象的关系与使用方式—2019年9月29日

L先生的博客
L先生的博客原创
2019年10月13日 14:02:56753浏览

匿名函数的三个应用场景

场景1: 匿名函数做为:值来使用

$max_num = function ($a, $b) {
   return $a>$b?$a:$b;
};

echo $max_num(46, 9);

//结果:46

场景2. 做为回调参数来使用

$arr = [3,1,6,2,9];
//可以使用sort函数直接对数组中的数据进行升序排序
//sort($arr);
//die ('<pre>' . print_r($arr, true));

//usort — 使用用户自定义的比较函数对数组中的值进行排序
usort($arr, function ($a, $b)

{
   // 太空船运算符
//  return  $a <=> $b;
//  return  $a - $b;
//  以上两个都是从小到大排序
//  从大到小排序
   return $b-$a;
});
//格式化输出数组的方法
echo '<pre>' . print_r($arr, true);

场景3.获取父作用域中的变量

$name = '畅意';
$Name = function () use ($name) {
   return $name;
};
echo $Name();
echo '<hr>';
// demo 是父函数
function demo() {
   // 父作用中变量
   $email = '123@163.com';
   // func: 匿名子函数
   return function () use ($email){
       return $email;
   };
}
echo demo()();

命名空间的意义

        从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件   foo.txt 可以同时在目录/home/greg 和   /home/other 中存在,但在同一个目录中不能存在两个   foo.txt 文件。另外,在目录 /home/greg 外访问   foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到   /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。

在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:

     用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。    

     为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。    

PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。

实例演示多个命名空间的场景

实例

<?php
/*在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突
为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
换言之:
解决命名冲突
重命名*/
//举例
namespace my; //定义命名空间
//覆盖php类
class mysqli {
    public function query(){
        return 1;
    }
}
//覆盖php函数
function preg_replace_callback() {
    return 2;
}

//覆盖php常量
const PHP_SAPI = 3;

$a = new mysqli();
var_dump($a->query());
$b = preg_replace_callback();
var_dump($b);
var_dump(PHP_SAPI);
//结果:int(1) int(2) int(3)
//如果我们要用php的mysqli类:最前面加上\即可
$a = new \mysqli();

运行实例 »

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

我们在项目中遇到最多的情况是有两个同名的类库或方法而造成的冲突。假设有A,B两个第三方类库,它们都有Cache类,我要同时使用到他们两个:

├─application
│  ├─A
│  │  ├─Cache.php
│  ├─B
│  │  ├─Cache.php
│  ├─test.php

A/Cache.php:

namespace A;

class Cache{function set(){return 'ok';}}

B/Cache.php:

namespace B;

class Cache{function set(){return 'success';}}

test.php

require 'A/Cache.php';

require 'B/Cache.php';
$cache = new A\Cache();
var_dump($cache->set());
$cache = new B\Cache();
var_dump($cache->set());

结果:string(2) "ok" string(7) "success"

namespace和__NAMESPACE__

__NAMESPACE__返回当前命名空间字符串,namespace关键字可以用来显式访问当前命名空间或子命名空间中的元素

$classname = __NAMESPACE__.'\mysqli';
$a = new $classname();
var_dump($a->query);
$a = new namespace\mysqli();
var_dump($a->query());

结果:int(1) int(1)

use

use关键字就是用来指定使用哪个命名空间的,上面的例子我们没有使用到use是因为我们new的时候指定了路径。

test.php改成使用use:

use A\Cache;

require 'A/Cache.php';

require 'B/Cache.php';
$cache = new Cache();   //new A\Cache

var_dump($cache->set());

$cache = new B\Cache(); //new B\Cache

var_dump($cache->set());

这样每次new Cache就默认是实例化了A\Cache了

use as可以指定别名,当某个类库命名空间很长的时候就可以as一个短名称

namespace Blah\Blah\Blah;

class CacheSomeThingImportingAndVeryDangerous{   

function set(){return 'success';}
}

使用use as

use Blah\Blah\Blah\CacheSomeThingImportingAndVeryDangerous as Cache;

require 'B/CacheSomeThingImportingAndVeryDangerous.php';
$cache = new Cache();
var_dump($cache->set());

类与对象的关系与使用方式

实例

<?php
namespace _0929;
class Demo6
{
    // 变量给它一个逼格高的名称: 属性
    public $product = '手机';
    public $price = 2800;
}

//一个程序中, 至少要有变量和函数,最基本的组成部分

// 1. 类的实例化
$obj = new Demo6();

// 2. 访问类中成员,用对象访问
echo '商品名称: ' . $obj->product, '<br>';
echo '商品价格: ' . $obj->price;

运行实例 »

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

总结

一个php文件可以有多个命名空间,在这些不同的命名空间下可以有同名的类,命名空间必须是脚本的第一行代码,用于解决命名冲突和重命名。

类是对象的模板

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议