PHP基础之面向对象

类常量

  • 定义形式:
const 常量名 = 常量值;
const P1 = 1; 
  • 使用形式:
类名::常量名;  
$v1 = C1::P1
//Const定义的常量是局部常量,只能在类中使用;
//Define()定义的常量永远是全局常量,在任何地方都能使用。

普通属性(实例属性)

  • 定义形式:
public $属性名 = 初始值;
  • 使用形式:
    $对象->属性名;
    $v1 = $对象->属性名;    //赋值
    echo  $对象->属性名;    //输出

静态属性

  • 定义形式:
static $属性名 = 初始值;
  • 使用形式:
类名::$静态属性名;

静态属性不属于任何一个对象,只属于该类本身,理解为该类的所有对象所共有的数据。

静态属性和类常量在内存中都只有一份,但静态属性的值可变,而常量值不能变(不同点)。

普通方法(实例方法)

  • 定义形式:
function 方法名(形参1=默认值,形参2=默认值,...){
    //方法体
}
  • 调用形式:
$对象名->方法名([实参1,实参2,...]);

静态方法

静态方法不需要所在类被实例化就可以直接使用。

  • 定义形式:
static function 方法名(形参1=默认值,形参2=默认值,...){
    //方法体
}
  • 调用形式:
类名::方法名(实参1,实参2,....)

类没有创建,静态属性就可以直接使用。那静态属性在什么时候在内存中被创建?

在PHP中没有看到相关的资料,引用Java中的概念解释具有通用性:

静态属性和方法,在类被调用时创建。

类被调用,是指类被创建或者类中的任何静态成员被调用。

构造方法(__construct)

  • 构造方法私有化
//用于单例模式
private function __construct(){
}
  • 子类构造方法中调用父类的构造方法
parent::__contrust
  • 子类普通方法中调用父类实例方法
parent::方法名()
  • 静态方法中调用静态属性
self::$p2

析构方法(__destruct)

  1. 当对象销毁前,自动调用析构方法。
  2. 对象销毁有两种情况:脚本执行完毕自动销毁,手动销毁对象(unset)。
  3. 析构方法也是成员方法,析构方法一定没有参数。
  4. 析构方法的作用:用于释放内存、清理内存垃圾,如断开数据库连接。

$this、self、parent三个关键字的区别

$this

  1. this代表调用当前属性或方法的这个对象。调用类中的成员方法或成员变量,只能通过伪变量$this调用。
  2. this是指向对象实例的一个指针,在实例化的时候来确定指向;

self

  1. self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。
  2. 使用类里面静态(一般用关键字static)的成员,必须使用self来调用。
  3. 使用self来调用静态变量必须使用 :: (域运算符号)
  4. self是对类本身的一个引用,一般用来指向类中的静态变量;
  5. self::$instance instanceof self 或 new self()

parent

  1. parent一般是指父类这个类本身,一般使用parent来调用父类的构造函数。
  2. parent是对父类的引用,一般使用parent来调用父类的构造方法。

普通方法和静态方法的区别

  • 普通方法,存放类内,只有一份
    1. protect 只能被本类和它的继承类调用
    2. private 只能被本类调用
    3. public 公有属性和方法,类内部和外部的代码均可访问。
  • 静态方法,也是存放于类内,只有一份

Static关键字:

声明类成员或方法为static,就可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法除外)。
由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。
静态属性不可以由对象通过->操作符 来访问。
用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。
就像其它所有的PHP静态变量一样,静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。 可以把静态属性初始化为整型或数组,但不能指向另一个变量或函数返回值,也不能指向一个对象。

  • static静态方法和静态属性总结:
    1. 静态属性不需要实例 即可调用。因为静态属性存放的位置是在类里,调用方法为”
    2. 类名::属性名”;
    3. 静态方法不需要实例化即可调用。同上
    4. 静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里;
    5. 静态方法可以调用非静态方法,使用 self 关键词。php里,一个方法被self:: 后,它就自动转变为静态方法;
    6. 静态方法可以被继承,但不可以被重写,在子类里定义相同名字的方法,只能算是隐藏。如果子类中出现同名的静态方法和字段,将重新创建新的同名的静态字段和方法,隐藏原来的静态方法和字段,而不是重写和覆盖
    7. 静态属性可以被继承。

值传递与引用传递

  • PHP默认“值传递”的数据类型:字符串型、整型、浮点型、布尔型、数组。
  • PHP默认“引用传递”的数据类型:对象、资源。

最终类和最终方法

  1. Final关键字修饰的类,就是最终类;
  2. Final关键字修饰的方法,就是最终方法;
  3. 最终类,就是最后的类,只能用来实例化,不能再继承。
  4. 最终方法,就是最后的方法,不能重写,但可以继承。
  5. 最终类是十分完善的类,不需要升级和扩展。
  6. 最终方法是十分完善的方法,不需要重写。
  7. 提示注意:最终类和最终方法不能同时存在

抽象类和抽象方法

  1. Abstract关键字修饰的类,就是抽象类;
  2. Abstract关键字修饰的方法,就是抽象方法;
  3. 抽象类:该类不能直接实例化,只能用来继承。例如:基础类都是抽象类。
  4. 抽象方法:该方法必须先继承,后重写。
  5. 抽象方法只有方法名称,没有方法体,没有大括号;
  6. 抽象方法作用:就是方法的命名规范,也可以理解为子类的方法的大纲、变相的监督的机制。
  7. 抽象方法在子类必须要重写。
  8. 类中有一个方法为抽象方法,该类必须是抽象类;

多态

  1. 类的多态,就是类的多种形态。
  2. 类的多态,主要指方法的重载或方法重写。
  3. 方法重载:在一个作用下,定义两个同名的方法,PHP不支持。
  4. 方法重写:父类已存在的方法,在子类用同样的名字再定义一次。
  5. 为什么要进行方法重写呢?为了功能的升级。子类的定义同名方法,比父类更完善、更详细。
  6. 如果子类定义了同名方法,它的优先级高于父类的同名方法。

重写要求

  1. 子类重写的方法名称,必须要与父类方法名称一致;
  2. 子类重写方法的参数个数,必须要与父类方法参数个数一致;
  3. 子类重写方法的类型,必须与父类方法类型一致,要是成员方法都是成员方法,要是静态方法都是静态方法。
  4. 子类重写方法的权限,不能低于父类方法权限。
  5. 如果父类方法权限为public,子类重写方法权限必须是public。
  6. 如果父类方法权限为protected,子类重写方法权限是public、protected。
  7. 如果父类方法权限为private,子类无法继承,也无法重写。

猜你喜欢

转载自blog.csdn.net/github_27314097/article/details/81270993