trait,interface,abstract,PHP7新特性以及PHP闭包学习

Posted qsanunnaki

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了trait,interface,abstract,PHP7新特性以及PHP闭包学习相关的知识,希望对你有一定的参考价值。

1月8日
trait
php5.4.0起,PHP实现了一种代码复用的方法 称为trait
trait 是为 PHP这类单继承语言准备的一种代码复用机制 。trait 为了减少单继承语言的限制,使开发者可以在不同层级中独立的调用 trait中的 方法 trait和类的组合使用,避免了一般类的多继承和混入类(Mixin)相关的典型问题。

trait 类似于一个类
trait 不能被实例化 使用方法
其他类中use,既可单独调用
例子:
trait say{
public function say_word(){
echo ‘word‘;
}
}
class demo{
use say;
public function test(){
echo ‘say‘;
}
}
$obj=new demo();
$obj->demo();
$obj->say_word();
//输出 say word


TP5.1中的jump (success,error )就使用了trait
TP5.1中的controller 类中 使用了 use jump 所以可以直接在继承了controller的方法中直接调用 success,error,redirect等方法


interface 接口类 以及 abstract 抽象类

首先接口类 interface

根据名字来 接口类我的理解就是 多个类的初始化工作

interface 接口类可以指定某个类有哪些实现现,但是不需要方法中的内容,也就是说,方法内部为空。且所有方法必须是公有的。

使用接口类的场景:
定义类的规范,保持统一性
多个平级类都需要使用这些方法,只是实现的方式不一样


接口类的继承使用 implements 关键字
接口类使用规范
属性必须是常量
不能被实例化
方法必须是公共的 public
类必须实现接口的所有方法
一个类可以有多个接口,逗号隔开
接口可以继承接口
接口类对参数要求严格,必须保持一致
例子如下
interface people{
const num=5;
public function hinds(string $words,$num);
}
class demo1 implements people{
public function hinds(string $words, $num){
if($num<10){
$num=self::num;
}
echo $words.‘,‘.$num.‘个人。举起你们的双手‘;
}
}
$demo=new demo1();
$demo->hinds(‘我来了‘,1);

abstract class 抽象类
抽象类 abstract 类似于接口类和实际类之间的一个层
abstract 的作用也是相当于把类中公共的方法剔出来
类似于写一个公共的 class 然后继承
抽象类与接口类的区别
1 interface 需要实现,要用 implements abstract class 需要继承,要用extends
2 一个类可以有多个接口类 但是只能有一个抽象类
3 interface 中每个方法都是抽象方法,每个方法都要实现。abstract 并非所有的方法都是抽象的 ,只有带有abstract 的方法才是抽象的,才是必须要实现的 ,另外补充一句,申明为abstract的方法也不能有函数体。
4 接口类的抽象方法 访问修饰符只能是public 抽象类中可以使用 public 以及protected 修饰符,但是不能使用 private
例子

//抽象类
abstract class base{
protected $cat=‘123‘;
abstract function int();
public function test($num){
return $num.‘个人向我走来‘;
}

}
class done extends base{
private $num=5;
private $name;
public function __construct(){
$this->int();
}
//抽象类中关键字为abstract 必须在子类中实现
public function int(){
echo ‘<br/>‘;
}
public function write(){
return $this->cat.‘是我家猫的名字‘;
}
public function msg(){
return $this->test(5);
}
}
$done=new done();
echo $done->write();
$done1=new done();
echo $done1->msg();


PHP7新特性学习
首先说我自己遇到的坑
foreach 函数
foreach
foreach 在 以前的版本如果循环中改变数组的值 那么数组本身也会改变
也就是说 以前的版本foreach会指向数组的内部指针
7.0是不可以的
PHP新增加项
1:定义方法时可以申明 参数以及返回值类型(string,int,float,bool)
declare(strict_types=0);//标量类型申明模式 必须放在最前面
function test( int $num){
return $num;
}
2 新增操作符 ‘<=>‘
语法 $a=$b<=>$c;
如果 $b>$c $a 为1
如果$b=$c $a 为0
如果$b<$c $a 为-1
3新增操作符 ??
原语法 $id=isset($_GET[‘ID‘])?$_GET[‘ID‘]:0;
现语法 $id=$_GET[‘ID‘]??0;
4:支持常量定义数组
define(‘ARRAY‘,[1,2,3,4]);
5:匿名函数(闭包)
JS中父级函数的参数是可以直接在子函数中直接使用的
PHP是不行的 如果需要使用,要用到关键字use($val)
$content = ‘这里是闭包函数的输出内容‘;
$fnc=function ($callback) use ($content){
$callback($content);
};
function call($content){
// 闭包函数
echo $content;
}
$fnc(‘call‘);


























































































































以上是关于trait,interface,abstract,PHP7新特性以及PHP闭包学习的主要内容,如果未能解决你的问题,请参考以下文章

trait or abstract class?

快学Scala 第十九课 (trait的abstract override使用)

Scala快速入门--Trait

scala中trait学习笔记

Traits vs. Interfaces vs. Mixins?

abstract和interface的区别?