php的面向对象很规矩啊,与js不同,js中没有类,没有接口,处处为对象;php有类,有接口,有很规矩的对象。
php的对象就是类的实例化:
class Dog implements IAnimal{
public function Eat() {
echo "dog can eat...";
}
}
$dog = new Dog();
$dog->Eat();
$dog
是类Dog
的实例化对象,拥有Eat
方法,我们可以看,这个方法是public
得,public
是php得一个关键字,下面我们就来看一下php的关键字。
public
: 在本类,子类或其他类中都可以访问到;private
: 只有在本类中可以访问到;protected
: 在本类,子类中可以访问到,其他类中不可以访问到;static
: 对象被销毁后,仍然会保留static
类型的成员变量和方法,(静态方法中只能调用静态变量,但是普通方法中都可以调用)静态类型在类第一次被加载时就已经被分配了内存空间。个人感觉着有点像js中的全局变量啊。final
:表示不可以继承,假如是类,则不可以有子类,如果是类中的方法,则该方法不可以重写和覆盖。
final class Dog{
public function eat() {
echo "dog can eat...";
}
}
class Spot extends Dog {};
// 报错,Dog类是final类型,不可以有子类
class Dog {
final function eat() {
echo "dog can eat...";
}
}
class Spot extends Dog{
function eat() {
echo "sopt can eat...";
}
};
// 报错,方法类型为final,不能被覆盖
类常量
const PI = 3.1415926;
class Dog {
const PI = 3.14;
}
echo Dog::PI; // Dog为作用域符号,指的是调用Dog类下的常量PI,Dog类并不用实例化就可以访问到
$dogA = new Dog();
echo $dogA->PI; // 报错,类常量不可以这么访问
构造方法和析构函数
构造函数(__construct
)对类的一些成员变量进行初始化;
析构函数(__destruct
)与构造函数相反,对象被销毁时调用,来释放内存,但是使用根本不多,因为php不像C++那样,php有垃圾回收机制,所以析构函数不怎么用写就可以。
class Dog {
public $name;
public $age;
private $job; // 本类以外不能调用
function __construct($name,$age,$job) {
$this->name = $name;
$this->age = $age;
$this->job = $job;
echo "实例化对象时来调用初始化变量";
}
// 我们复写一下这个析构函数,来看其何时调用
function __destruct() {
echo "实例化对象内存被销毁";
}
}
$dog = new Dog("zp",19,"student"); // 实例化对象时来调用初始化变量
echo $dog->name;
// echo $dog->job; // 报错啊,job是私有变量啊
unset($dog); // 实例化对象内存被销毁
继承
在继承时,php子类的构造函数,会优先调用子类的构造函数
class Animal{
function __construct() {
echo '我是父类构造函数';
}
}
class Dog extends Animal{
function __construct() {
echo '我是子类构造函数';
}
}
$dog = new Dog(); // 我是子类的构造函数
抽象类和接口,抽象类->抽象类中至少要包含一个抽象方法,抽象方法并没有方法体,方法体必须在子类中去实现,并且抽象类不可以被实例化。
abstract class Animal{
abstract function eat();
}
class Dog extends Animal{
function eat () {
echo "dog can eat...";
}
}
$dog = new Dog();
$dog = new Animal(); // 报错
$dog->eat();
接口,用关键字interface
来定义接口,接口中不会写任何的方法体,全部依靠类来实现,类实现接口用关键字implements
interface IAnimal{
function Eat();
}
class Dog implements IAnimal{
public function Eat() {
echo "dog can eat...";
}
}
$dog = new Dog();
$dog->Eat();
php只支持单继承,但是我们可以用接口来实现多继承:
interface IAnimal{
function Eat();
}
interface IDog{
function Sleep();
}
class Dog implements IAnimal,IDog{
public function Eat() {
echo "dog can eat...";
}
public function Sleep() {
echo "dog can sleep...";
}
}
$dog = new Dog();
$dog->Eat();
$dog->Sleep();