1. 程式人生 > >trait,interface,abstract,PHP7新特性以及PHP閉包學習

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