OOP的基本概念
提问环节
- 说说什么是抽象类
- 说说如何访问静态方法
- 说说什么是接口
- 说说什么是继承
命名空间
在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。
虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。
命名空间通过关键字 namespace
来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。
http://php.net/manual/zh/language.namespaces.definition.php
代码实例:
D:\wamp7\www\demo\Test1.php
class Test
{
public function __construct()
{
var_dump('实例化了一个Test1文件声明的Test类');
}
}
D:\wamp7\www\demo\Test2.php
class Test
{
public function __construct()
{
var_dump('实例化了一个Test2文件声明的Test类');
}
}
D:\wamp7\www\demo\demo.php
include('./Test1.php');
include('./Test2.php');
Fatal error: Cannot declare class Test, because the name is already in use in …
使用命名空间来解决类名冲突的问题。
D:\wamp7\www\demo\Test1.php
<?php
namespace App\Think;
class Test
{
public function __construct()
{
var_dump('实例化了一个Test1文件声明的Test类');
}
}
D:\wamp7\www\demo\Test2.php
<?php
namespace App\Laravel;
class Test
{
public function __construct()
{
var_dump('实例化了一个Test2文件声明的Test类');
}
}
D:\wamp7\www\demo\demo.php
<?php
use App\Laravel\Test;
include('./Test1.php');
include('./Test2.php');
$obj1 = new \App\Think\Test();
$obj2 = new \App\Laravel\Test();
$obj3 = new Test();
D:\wamp7\www\demo\demo.php
<?php
use App\Laravel\Test as Demo;
include('./Test1.php');
include('./Test2.php');
$obj1 = new \App\Think\Test();
$obj4 = new Demo();
traits 可复用代码块
自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。
Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。
D:\wamp7\www\demo\Demo.php
<?php
class Article
{
public function owner()
{
var_dump('Comment Owner');
}
}
class Comment
{
public function owner()
{
var_dump('Comment Owner');
}
}
(new Article())->owner();
(new Comment())->owner();
D:\wamp7\www\demo\Demo.php
<?php
trait OwnerTrait
{
public function owner()
{
var_dump('Comment Owner');
}
}
class Article
{
public function owner()
{
var_dump('Comment Owner');
}
}
class Comment
{
use OwnerTrait;
}
(new Article())->owner();
(new Comment())->owner();