//静态继承上下文
class A
{
public function demo()
{
//.....
}
}
class B extends A{
public function demo()
{
parent::demo();
}
}
## 上面便是一个继承上下文环境,若要改为静态继承上下文,直接在function前面加static 即可
2.后期静态绑定
//后期静态绑定:也叫延迟静态绑定
## 后期静态绑定工作在静态继承上下文环境中
//创建一个抽象类
abstract class Creat
{
}
//创建实现类
class User extends Creat
{
public static function create(){
return new static();
}
}
class Product extends User
{
}
var_dump(User::create());
//输出 object(User)#1 (0) { }
echo '<hr>';
var_dump(Product::create());
//输出 object(Product)#1 (0) { }
## 方法里面如果用new self() 他返回的是实现该方法的类的类名 、 使用 new static() 他返回的是调用该方法的类的类名
<?php
//我们可以把它上移到抽象类中
## 注意:抽象类不能实例化,所以使用new self() 是错误的
//解决方案:将类的定义与类的调用完全分离开。使用后期静态绑定方案 static 关键字将self替换掉
//创建一个抽象类
abstract class Creat
{
public static function create(){
// return new self();
return new static();
// self 始终与定义该方法(属性)的类进行绑定
// static 始终与调用该方法(属性)的类进行绑定
}
}
//创建实现类
class User extends Creat
{
}
class Product extends User
{
}
var_dump(User::create());
//输出 object(User)#1 (0) { }
echo '<hr>';
var_dump(Product::create());
//输出 object(Product)#1 (0) { }
3.魔术方法
<?php
//魔术方法
//语法:类中有一些方法总是使用双下划线开头,这就叫魔术方法
// 调用者:由系统根据一定的条件或用户行为,自动调用/触发,禁止用户主动调用
//构造方法:__construct(),是类的实例化过程中被自动调用,new的时候
class Product{
private $name;
private $price;
// 创建构造器:生成一个新对象
public function __construct($name,$price)
{
## $this是由PHP接管的对象,不能用户设置
// $this = new self(); 此段省略即可
## 初始化这个新对象:给这个新对象添加属性并赋值,或自动执行某些操作方法
$this->name = $name;
$this->price = $price;
$this->white();
## 返回这个刚创建并初始化的对象
// return $this;
## 隐式返回当前新生的类实例,不用显示返回,自动完成
}
public function white()
{
echo $this->name.':'.$this->price;
}
}
//只需将参数传入到类中即可
$product = new Product('上衣',500);