一、类的静态成员、类引用self::
/**
* 静态成员、类常量是属于类本身,不需要实例化,就可以被访问到
* 1. static 静态成员
* 2. self:: 类引用
* 3. const 类常量
* 4. __callStatic 当调用部存在的静态方法时
* 5. :: 范围解析符 用于类常量,静态成员的访问
*/
class Teacher
{
public const cates = ['前端','后端','全栈'];
// 静态属性
public static string $uname;
private static int $salary;
static int $count = 0;
// 修饰符 放在 类型符 前面 : static string
public static string $siteName = 'php中文网';
// 静态方法:如果是公共的,可省public,不建议
public static function getCount()
{
// 静态成员与类的实例无关,不能用 $this 来访问
// 使用 self:: 引用,静态成员用$ sell::$count
return sprintf(__CLASS__ . '类被实例化了%d次' , self::$count);
}
public function __construct($uname,$salary)
{
self::$uname = $uname;
self::$salary = $salary;
self::$count++;
}
public static function getBK(){
return self::$uname . '来自' . self::$siteName . '可以胜任' . join(',', self::cates);
}
}
// print_r(Teacher::cates); //类常量不建议类外部访问
$mj = new Teacher('灭绝',20000);
//echo $mj->getCount();
echo Teacher::getCount()."<br />";
echo Teacher::getBK();
注意点:
修饰符 放在 类型符 前面 : static string
静态方法:如果是公共的,可省public,不建议
静态成员与类的实例无关,不能用 $this 来访问;使用 self:: 引用,静态成员用$ sell::$count
类常量不建议类外部访问
二、接口、抽象类、trait
2.1、interface 定义接口
interface iDemo
{
// 所有成员必选是公共的
public const gender = 'MALE';
// 所有方法都是抽象方法(只有声明,没有实现)
public function sum($a, $b);
public function sub($a, $b);
public function mul($a, $b);
public function div($a, $b);
}
2.2、imlements 实现接口,abstract抽象类抽象方法
abstract class aDemo implements iDemo{
public function sum($a, $b)
{
return $a + $b;
}
public function sub($a, $b)
{
return $a - $b;
}
// 没有实现的方法,在抽象类中可声明
abstract public function mul($a, $b);
abstract public function div($a, $b);
}
interface A{
public const A = 1;
}
interface B{
public const B = 2;
}
class User implements A, B {}
2.3、trait
组合式继承,解决php oop 单继承,高耦合的诟病
// trait: 工具箱,基于类的语法,但和接口一样,不能实例化
trait t1
{
public function dump($data){
var_dump($data);
die;
}
}
trait t2
{
public function sum($a,$b,...$arg)
{
return $a + $b +array_sum($arg);
}
}
class work1 extends work
{
use t1,t2;
/*
public function sum($a,$b,...$args)
{
return "hello php中文网";
}*/
}
echo (new work1)->sum(10, 20, 30, 40, 50);
注意点:
定义接口的所有成员必选是公共的
定义接口所有方法都是抽象方法(只有声明,没有实现)
oop 单继承 只能继承一个父类
但可以实现多个接口,多态
抽象类中可以有抽象方法,可以部分实现接口中的抽象方法
没有实现的方法,在抽象类中可声明
* 同名方法优先级别:当前类同名成员 > trait > 继承成员
三、后期静态绑定 static::
// ! 后期静态绑定 static::
// 静态继承时,不要再用self::,全部用static::
class Car
{
private static function getName()
{
return 'Car';
}
public static function run()
{
// ! php内核将类的继承实现了放在编译阶段 就确认了self解析为car
// self:: 的限制,对当前类的静态引用,取决于定义当前方法所在的类,定义类和调用类不能绑定
// return self::getName();
// ! static 后期静态绑定 static::不再被解析为定义当前方法所在的类,而是实际运行时计算的
return static::getName();
}
}
class BMW extends Car
{
public static function getName()
{
return 'E300';
}
}
echo Car::run() . PHP_EOL; // Car
echo BMW::run() . PHP_EOL; // Car
四、查询构造器(链式调用)
查询构造器:Db::table()->field()->where()->limit(1)->select();
class Query
{
protected $db; // pdo链接对象
protected $table;
protected $field;
protected $limit;
// 链接数据库
private function connect($dsn, $username, $password)
{
$this->db = new PDO($dsn, $username, $password);
}
function __construct($dsn, $username, $password)
{
$this->connect($dsn, $username, $password);
}
function table($table)
{
$this->table = $table;
return $this;
}
function field($filed)
{
$this->field = $filed;
return $this;
}
public function limit($limit)
{
$this->limit = $limit;
return $this;
}
public function getSql()
{
return sprintf('SELECT %s FROM %s Limit %d', $this->field, $this->table, $this->limit );
}
public function select()
{
return $this->db->query($this->getSql())->fetchAll(PDO::FETCH_ASSOC);
}
}
// 工作类
class db
{
static function __callStatic($method, $args)
{
$dsn = 'mysql:host=localhost;dbname=shop';
$query = new Query($dsn,'root', 'root');
// 直接委托给Query类中的普通方法完成
return call_user_func([$query, $method],...$args);
}
}
$res = Db::table('users')
->field('uid,username,phone')
->limit(3)
->select();
var_dump($res);
注意点:
@形参名字可以随便起名字,一一对应即可;
链式调用的方法名系统已固定,不可更改
function field($filed1)
{
$this->field1 = $filed1;
return $this;
}
public function limit($limit)
{
$this->limit = $limit;
return $this;
}
public function getSql()
{
return sprintf('SELECT %s FROM %s Limit %d', $this->field1, $this->table, $this->limit );
}
public function select()
{
return $this->db->query($this->getSql())->fetchAll(PDO::FETCH_ASSOC);
}
// 工作类
class db
{
static function __callStatic($method, $args)
{
$dsn = 'mysql:host=localhost;dbname=shop';
$query = new Query($dsn,'root', 'root');
// 直接委托给Query类中的普通方法完成
return call_user_func([$query, $method],...$args);
}
}
$res = Db::table('users')
->field('uid,username,phone')
->limit(3)
->select();
var_dump($res);