星期三,晴天,学习进行中 【全是概念性的东西】
学习内容包含:多重trait与抽象及静态方法的使用,类属性的关键词的控制 ,构造函数和析构函数 ,__SET 和 __GET的使用
多重trait与抽象及静态方法的使用
tait可以被多重继承并且可申明静态方法和抽象方法。
trait Log{
public function save(){
return __METHOD__;
}
}
trait Comment{
public function user(){
return __METHOD__;
}
public function save(){
return __METHOD__;
}
}
trait GetOneName{
abstract public function getHttp();
public static function getStaticName(){
return 'static....name';
}
public function getSiteName(){
return 'www.jiujiu.com';
}
}
class Site{
use GetOneName;
public function save(){
return __METHOD__;
}
public function getHttp()
{
// TODO: Implement getHttp() method.
}
}
class Tools extends Site{
use Log,Comment{
Log::save insteadof Comment;
Comment::save as protected saveRe;
}
}
echo Tools::getStaticName();
本节知识点,基本理论知识点都是能够理解的,运用起来才是难哦
类属性的关键词
trait oss{
protected function ossfun(){
return '...ossfun...';
}
}
class upload {
use oss;
public function uploadfile(){
$show_text = '';
/*第一步:上傳本地文件*/
$show_text.=$this->uplocaltion();
/*第二步:上傳到OSS*/
$show_text.=$this->ossfun();
/*第三步:返回圖片路徑*/
return $show_text;
}
private function uplocaltion(){
return '...uplocation...';
}
}
$obj = new upload();
echo $obj -> uploadfile();
public:全世界均可使用 private:只有自己可以用 protected:子父均可用。
构造函数和析构函数
class Code{
protected $width;
public function __construct(int $width = 100)
{
$this -> width = $width;
}
public function getCode(){
return '牛逍遥是一个' .$this -> width.'重的妞妞';
}
public function __destruct()
{
// TODO: Implement __destruct() method.
echo 'die';
}
}
$a = new Code();
echo $a-> getCode();
echo '<hr/>';
牛逍遥是一个100重的妞妞
die
构造函数和析构函数就是一个生死劫,创造的时候被自动调用,当对象被释放后,直接die掉,可以用作在我之前写的一个上传图片到OSS中很好的使用,上传文件到OSS使用后端上传,需要先传递到后端生成服务器文件,然后再次调用上传到OSS端去,在这里我们在上传OSS成功后就需要做一个处理,把我们上传到本地服务器的图片资源down掉,不然服务器资源越来越多,上传OSS的意义就失去了。
__GET和__SET的使用,并且延伸了 method_exists 和 call_user_func_array的使用上代码,很多都写在了注释里面,不做阐述了
/**
* Class Query 将数据库模型拆分 1.数据库链接等这些东西 我们就可以抽象出这样的的一个类
*
*/
abstract class Query{
//1.模拟数据库链接,好的链接到了。
//2.那么我们可以将查询数据的需要存储抽象成为一个抽象方法,为了提高解耦性,那么我需要设置当前方法为受保护的方法,
//那这里的为什么需要抽象一个方法出来,因为你想我数据查询到了,得记录啊,那怎么办,我得将把这个方法抽象出来,然后呢操作就放在
//继承当前类的子类里面去
abstract protected function record(array $data);
//3.走查询的步骤,飞起
public function select(){
//假设数据查询到了,那么我就要干嘛,把数据扔出去
$this -> record(['name' => '张三','mobile' => '1502947774']);
}
}
/**
* Class Model 虚拟数据库Model查询
*/
class Model extends Query{
//首先继承抽象类需要实现抽象类里面的抽象方法
protected $field = [];
protected function record(array $data)
{
// TODO: Implement record() method.
$this -> field = $data;
}
public function selectAll(){
$this -> select();
return $this -> field;
}
private function __mobile($name){
return '我是被二次处理过的手机号码:'.$this -> field[$name];
}
//接下里需要说的就是__get的使用
//我们在查询到数据后,肯定是需要说要获取当前查询的数据中的某一个值的
public function __get($name)
{
// TODO: Implement __get() method.
//我们可以延伸出一个问题,当我们在调用手机号码的时候,我需要默认去对手机号码处理
if (method_exists($this,'__'.$name)){
//存在就去调用当前的这个方法 把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入。
return call_user_func_array([$this,'__'.$name],[$name]);
}
if (isset($this -> field[$name])){
return $this -> field[$name];
}else{
throw new Exception('参数'.$name.'在数据库不存在');
}
}
//__set的使用:如果当前值存在则重新复制,否者直接报参数错误,可以应用到,
//比如说你查询到一个数据,本身是对象形式的,你需要转换成数组形式,那么__set是很有必要的
public function __set($name, $value)
{
// TODO: Implement __set() method.
if (isset($this -> field[$name])){
$this -> field[$name] = $value;
}else{
throw new Exception('当前参数'.$name.'消失啦');
}
}
}
try{
$obj = new Model;
$obj -> selectAll();
$obj -> mobile = '1502946677900';
echo $obj -> mobile;
}catch (Exception $e){
echo $e -> getMessage();
}
当前参数mobiles消失啦










网友评论