面向对象
类:现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起。比如人类、动物类
对象: 具有类类型的变量。比如人类中的张三这就是一个对象。他有人类的特性,比如说话写字等。
属性:类型的特征 比如人的名字、年龄、身高都是人的特征属性。
方法:方法是将一些操作封装起来的过程。类似函数。
继承:从父类那获得特征。比如人从父亲那继承了父亲的姓名。
class (类)
每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义
类名是非php保留字以外的合法的标签。合法的类名和变量一样。字母、下划线开头,后面跟任意字母或数字。
自 PHP 5.5 起,关键词 class 也可用于类名的解析。使用 ClassName::class 你可以获取一个字符串
class Person {
public $name;
public $age;
public function say(){
echo "hello";
}
}
echo Person::class;//Person 如果带命名空间。则会加上命名空间要创建一个对象。使用new关键字
$zhang = new Person();
$zhang->name = '张三';extends (继承)
一个类可以在声明中用 extends 关键字继承另一个类的方法和属性。PHP不支持多重继承,一个类只能继承一个基类。
被继承的方法和属性可以通过用同样的名字重新声明被覆盖。如果父类的方法使用了final。则不会被覆盖。
当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖时使用不同的参数
class Boy extends Person {
}类常量
在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号
类常量是一个定值。类常量使用const 定义。访问的时候使用**self:😗*访问类常量
class C{
const PI = 3.1415926;
public function test(){
echo self::PI;
}
}自动加载
使用自动加载可以让我们不用一个个去include 类文件
自动加载不可用于 PHP 的 CLI
spl_autoload_register(function($class){
require $class.".php";
})构造函数、析构函数
构造函数在对象创建的时候,会被调用。适合初始化工作。
如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()
析构函数在到某个对象的所有引用都被删除或者当对象被显式销毁时执行
试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。
class P{
public function __construct(){
echo "construct";
}
public function __destruct(){
echo "destruct";
}
}
$p = new P();// construct;
unset($p);//destruct;访问控制
对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
public 修饰的 可以在任何地方访问到
protected修饰的只能在子类或该类中访问
private修饰的只能在该类中访问。
class A{
public $name = 'a';
protected $age = 10;
private $money = 100;
}
class B extends A{
public function test(){
echo $this->age;//a
}
public function testPrivate(){
echo $this->money;
}
}
$b = new B();
echo $b->name;//a
echo $b->test();//10
# 不可访问
echo $b->age;//error;
#子类不能访问
echo $b->testPrivate();//error范围解析操作符(::)
范围解析操作符(也可称作 Paamayim Nekudotayim)或者更简单地说是一对冒号,可以用于访问静态成员,类常量。还可以用于覆盖类中的属性和方法。
self,parent 和 static 这三个特殊的关键字是用于在类定义的内部对其属性或方法进行访问的
当一个子类覆盖其父类中的方法时,PHP 不会调用父类中已被覆盖的方法。是否调用父类的方法取决于子类。使用self调用父类,使用$this 调用本类。
class A{
public $name = 'a';
protected $age = 10;
private $money = 100;
}
class B extends A{
public static $s = 's';
const PI = 111;
public function test(){
echo $this->age;// 10
}
public static function testStatic(){
echo self::$s;
}
public function testConst(){
echo self::PI;
}
public function testPrivate(){
echo $this->money;
}
}
# self 和 $this
class ParentClass {
function test() {
self::who(); // will output 'parent'
$this->who(); // will output 'child'
}
function who() {
echo 'parent';
}
}
class ChildClass extends ParentClass {
function who() {
echo 'child';
}
}
$obj = new ChildClass();
$obj->test();//static 静态关键字
声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)
静态属性不可以由对象通过 -> 操作符来访问。静态属性只能被初始化为文字或常量。静态属性不随着对象的销毁而销毁。
class P{
$a = "world";
public static function test(){
echo "hello".self::$a;
}
}
p::test();