php面向对象
访问控制
public
- 可以通过
$this
调用public
方法或属性,parent::
调用父类的public方法或属性 - 在实例中可以能过$obj-> 来调用
public
类型的方法或属性
protected
- 可以通过
$this
调用protected
方法或属性,parent::
调用父类的protected方法或属性 - 在实例中不能通过
$obj->
来调用protected
类型的方法或属性
<?php
class MyClass{
public $test = 'test';
protected function show1(){
echo $this->test;
}
public function test1(){
$this->test;
}
}
class Child extends MyClass{
public function index(){
parent::show1();
$this->show1();
}
}
$class = new MyClass;
$child = new Child;
// $class->show1();Fatal error
$class->test1();
$child->index();
private
- 该类型的属性或方法只能在该类中使用
- 在该类的实例、子类中、子类的实例中都不能调用私有类型的属性和方法
<?php
class MyClass{
public $test = 'test';
private function show2(){
echo $this->test;
}
public function test2(){
$this->show2();
}
}
$class = new MyClass;
$class->test2();
关键字
self、$this、parent
this
是指向当前对象的指针self
是指向当前类的指针parent
是指向父类的指针
const、static
const
定义常量static
定义静态变量
const
和static
都属于类,可以直接从类调用(静态调用)
静态方法和静态变量是公共的,不会涉及到太多的逻辑,内部不可以用$this
。
<?php
class Test{
const AGE = 18;
public static $age = 18;
public static function getAge(){
// return $this->$age;Fatal error
return self::$age;
}
}
echo Test::AGE;
echo Test::$age;
echo Test::getAge();
抽象类
abstract
用于定义抽象方法和抽象类。
抽象方法:
抽象方法指没有方法体的方法,在方法声明事没有{}括弧以及其中的内容,而是直接在声明了方法后加上分号结束。
抽象类:
只要一个类中有一个方法是抽象方法,那么这个类就要定义为抽象类,抽象类同样用abstract关键字来定义。 抽象类不能产生实例对象,通常是将抽象方法作为子类方法重载的模板使用,且要把继承的抽象类里的方法都实现。
<?php
// 定义抽象类
abstract class Individual{
public $age = 18;
abstract function getAge();
public function test(){
echo 'test';
}
}
class Person extends Individual{
public function getAge(){
return $this->age;
}
}
$person = new Person;
$person->test();
echo $person->getAge();
接口
接口是一种规范,接口里的方法和抽象方法一样(不需要实现),implements
的子类必须实现全部接口
如果一个抽象类里面的所有方法都是抽象方法,且没有声明变量,而且接口里面所有成员都是public权限的,那么这种特殊的抽象类就是接口。
应用场景:
- 保持规范、统一性
- 多个类需要实现同样的方法,只是实现方式不一样
接口使用规范:
- 接口不能实例化
- 接口属性必须是常量
- 接口方法必须是public,且不能有函数体
- 类必须实现接口的所有方法
- 一个类可以同时实现多个接口,用逗号隔开
- 接口可以继承接口,使用
extends
关键字。 - 接口使用关键字
interface
来定义,使用implements
关键字来实现 - 类要实现接口,必须使用和接口中所定义的方法完全一致的方式。否则会导致致命错误.
- 实现多个接口时,接口中的方法不能有重名。
<?php
<?php
// 定义接口
interface Individual{
public function eat();
public function drink();
}
// 接口实现
class Person implements Individual{
public function eat(){
echo '炸鸡';
}
public function drink(){
echo '可乐';
}
}
$person = new Person;
$person->eat();
$person->drink();