PHP简明教程
面向对象基础 1
类中魔术方法
类中魔术方法不能被手动调用,几乎每个魔术方法都有触发时机和参数,PHP不能调用类中没有实现的魔术方法
方法名 | 触发时机 | 参数1 | 参数2 | 备注 |
---|---|---|---|---|
__get() | 对象访问类中private和protected属性时 | 私有或被保护的成员变量的名字 | 无 | |
__set() | 对象设置类中private和protected属性时 | 私有或被保护的成员变量的名字 | 设置的值 | |
__construct() | 当一个对象被创建时 | 无 | 无 | 继承时不会自动调用父类的该方法 |
__destruct() | 当一个对象被销毁时 | 无 | 无 | |
__unset() | 当销毁私有成员变量时 | 私有或被保护的成员变量的名字 | 无 | |
__isset() | 当检测私有成员变量是否存在时 | 私有或被保护的成员变量的名字 | 无 | |
__call | 当调用类中没有的成员方法时 | 调用的方法名 | 传递的参数 |
继承
PHP在语法上只支持单继承,可以用接口来实现多继承
基本语法
子类继承父类,就拥有了父类的成员变量和成员方法
访问权限
修饰符 | 能否类外访问 | 能否被继承 |
---|---|---|
public | 可以 | 可以 |
private | 不可以 | 不可以 |
protected | 不可以 | 可以 |
重写
意义:当子类继承父类的方法后,重新在子类中实现这个方法
重写的种类
- 完全重写
子类调用该方法后调用的是子类重写后的方法,父类调用该方法是父类自身的方法 - 扩展
通过parent
关键字先执行父类的方法,然后再增加自己的功能
parent
关键字
class Father
{
public $name;
public $age;
public $height;
function __construct($name, $age, $height)
{
$this->name = $name;
$this->age = $age;
$this->height = $height;
}
function work()
{
echo '我每天辛辛苦苦的工作15个小时<br />';
}
}
class Son extends Father
{
public $weight;
public $girl;
public $money;
function __construct($name, $age, $height, $weight, $girl, $money)
{
/*
$this->name = $name;
$this->age = $age;
$this->height = $height; */
//通过调用父类的__construct方法实现以上代码
parent::__construct($name, $age, $height);
$this->weight = $weight;
$this->girl = $girl;
$this->money = $money;
}
function work()
{
//echo '我每天喝着咖啡看着报纸清闲8个小时<br />';
//先执行父类的方法
parent::work();
//再写自己的代码
echo '我不仅工作的好,我还谈了一个对象,而且是厂花<br />';
}
}
$ming = new Son();
$ming->work();
//$long = new Father();
//$long->work();
final
关键字
final
修饰的class不能被继承
//A类不能被继承
final class A{
}
final
修饰的成员方法不能被重写
class A{
final function func(){
}
}
class B extends A{
//不能对A类中func方法重写,因为func方法是final的
}
重写中的方法权限修改
private < protected < public
越往后权限越高 重写的时候权限只能放大相等不能缩小
类常量
定义方式:
使用define
定义类外常量
使用const
定义类内常量 定义常量的时候不能加权限修饰符
调用方法:
类外
类名::常量名 ($obj::常量名)
类内
self::常量名 ($this::常量名)
$this 对象
self 类
parent 父类
静态属性和静态方法
如果在成员属性或者成员方法前面加了
static
进行修饰,那么这个成员属性或者成员方法就不在属于某一个对象,而是属于整个类的
如果该成员属性发生了改变这个类的所有实例化对象的该属性都会发生改变
如果一个方法与他所在类型的实例无关,那么它就应该是静态的。所以所有的实例方法都应与实例有关
静态属性调用方法:
类外
类名::静态属性名 ($obj::静态属性名)
类内
self::静态属性名 ($this::静态属性名)
静态方法调用方法
类外
类名::静态方法名 ($obj::静态方法名,$obj->静态方法名)
类内
self::静态方法名 ($this::静态方法名,$this->静态方法名)
自动加载
命名规则:一个类是一个文件;类名与文件名相同;命名空间名和文件夹名相同
__autoload()
唯一写在类外的魔术方法
触发时机:当文件加载一个类的时候,并没有找到这个类,那么就会自动触发这个方法
参数:类名
简单实现
__autoload($className){
$file = ucfirst($className) . '.php';
include $file;
}
MVC
MVC设计方法
目录结构:
graph TB
MVC-->model模型
MVC-->view视图
MVC-->controller控制
MVC-->vendor第三方库
MVC详解:
由模型(model),视图(view),控制器(controller)完成的应用程序由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;
MVC 是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用 MVC 应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。视图是用户看到并与之交互的界面。模型表示企业数据和业务规则。控制器接受用户的输入并调用模型和视图去完成用户的需求。
MVC 的优点:低耦合性、高重用性和可适用性、较低的生命周期成本、快速的部署、可维护性、可扩展性,有利于软件工程化管理
MVC 的缺点:没有明确的定义,完全理解 MVC 并不容易。不适合小型规模的应用程序。