类的封装性、 魔术方法的重载、类的自动加载以
类与对象、oop封装性、构造器
类包括属性和方法,属性有三类;结构方法是魔术方法,可实现私有和保护属性赋值;class User
{
// 成员属性 public,private尽对本类可见,protected 对本类及子类可见,构成opp封装性
public string $name;
private int $salary;
protected int $age;
public string $sex;
// 魔术方法,__开头,必须是公开的,构造方法是魔术方法的一类,__construct(),实例化时会被自动调用,用户无法调用,创造实例化初始状态
public function __construct($name, $salary, $age)
{
$this->name=$name;
$this->salary=$salary;
$this->age=$age;
}
public function login()
{
return $this->salary;
}
public function register()
{
}
}
魔术方法的应用:属性重载与方法重载
子类可以通过extends继承父类,实现属性重载和方法重载,增加完善功能。class Son extends Product
{
// 可以扩展属性和方法
public string $brand;
// 可以重写构造方法
public function __construct($name, $price, $num,$brand)
{
// parent调用父类参数
parent::__construct($name, $price, $num);
$this->brand = $brand;
}
public function total(){
return "$this->name,数量为{$this->num},总计".($this->price*$this->num).'元';
}
}
- 类的原生自动加载
利用spl_autoload_register实现类的自动加载// 类的自动加载
spl_autoload_register(function($className){
// echo $className;
$classFile = __DIR__.DS.'class'.DS.$className.'.php';
if(is_file($classFile)&&file_exists($classFile)) require $classFile;
});
- 类的继承与功能扩展
变量应该在model中赋值,在视图中使用,模板赋值时会自动调用系统函数,如get(),set(),__call()等
总结:这是很重要的一块内容,不必纠结一些小错误;真正的富翁无需强调自己很有钱,真正的编程高手也不必强调自己很专业;小白才会在乎别人是否小瞧的自己,把精力放在更重要的事情上。class View{
//模板变量在model中声明,在视图中使用
protected $data = [];
// 调用当前环境下未定义或不可访问的类属性时,重载方法__get会被调用。
public function __get($name){
return $this->data[$name];
}
// 赋值时自动调用
public function __set($name, $value){
$this->data[$name]= $value;
}
public function assign($name, $value=null){
if(is_array($name)){
$this->data = array_merge($this->data, $name);
// 整合数组时,后者权重高,如有相同索引,后者覆盖前者
}else{
$this->data[$name] = $value;
//也可以修改前面的值
}
}
// 调用当前环境下未定义或不可访问的普通方法时,重载方法__call会被调用。
public function __call($name,$args){
if($name=='show'){
return $this->data;
}
if($name=='sum'){
return array_sum($args);
}
}
}
$v =new View;
// 模板赋值
$v->name = 'peter'; //自动调用__set()
echo $v->name; //自动调用__get()
$v->assign('id', 123);
$v->assign(['email'=>'1234qq.com']);
$v->show();
echo $v->sum(12,23,34);
var_dump($v);
echo call_user_func([$v,'sum'], 34,45,56);