php面向对象(一)

来源:互联网 发布:怎样举报网络非法赌博 编辑:程序博客网 时间:2024/06/06 07:32

php面向对象(一)

authorzp2015-10-31 14:52-23

php的面向对象很规矩啊,与js不同,js中没有类,没有接口,处处为对象;php有类,有接口,有很规矩的对象。
php的对象就是类的实例化:

  1. class Dog implements IAnimal{
  2. public function Eat() {
  3. echo "dog can eat...";
  4. }
  5. }
  6. $dog = new Dog();
  7. $dog->Eat();

$dog是类Dog的实例化对象,拥有Eat方法,我们可以看,这个方法是public得,public是php得一个关键字,下面我们就来看一下php的关键字。

  • public: 在本类,子类或其他类中都可以访问到;
  • private: 只有在本类中可以访问到;
  • protected: 在本类,子类中可以访问到,其他类中不可以访问到;
  • static: 对象被销毁后,仍然会保留static类型的成员变量和方法,(静态方法中只能调用静态变量,但是普通方法中都可以调用)静态类型在类第一次被加载时就已经被分配了内存空间。个人感觉着有点像js中的全局变量啊。
  • final:表示不可以继承,假如是类,则不可以有子类,如果是类中的方法,则该方法不可以重写和覆盖。
  1. final class Dog{
  2. public function eat() {
  3. echo "dog can eat...";
  4. }
  5. }
  6. class Spot extends Dog {};
  7. // 报错,Dog类是final类型,不可以有子类
  1. class Dog {
  2. final function eat() {
  3. echo "dog can eat...";
  4. }
  5. }
  6. class Spot extends Dog{
  7. function eat() {
  8. echo "sopt can eat...";
  9. }
  10. };
  11. // 报错,方法类型为final,不能被覆盖

类常量

  1. const PI = 3.1415926;
  2. class Dog {
  3. const PI = 3.14;
  4. }
  5. echo Dog::PI; // Dog为作用域符号,指的是调用Dog类下的常量PI,Dog类并不用实例化就可以访问到
  6. $dogA = new Dog();
  7. echo $dogA->PI; // 报错,类常量不可以这么访问

构造方法和析构函数
构造函数(__construct)对类的一些成员变量进行初始化;
析构函数(__destruct)与构造函数相反,对象被销毁时调用,来释放内存,但是使用根本不多,因为php不像C++那样,php有垃圾回收机制,所以析构函数不怎么用写就可以。

  1. class Dog {
  2. public $name;
  3. public $age;
  4. private $job; // 本类以外不能调用
  5. function __construct($name,$age,$job) {
  6. $this->name = $name;
  7. $this->age = $age;
  8. $this->job = $job;
  9. echo "实例化对象时来调用初始化变量";
  10. }
  11. // 我们复写一下这个析构函数,来看其何时调用
  12. function __destruct() {
  13. echo "实例化对象内存被销毁";
  14. }
  15. }
  16. $dog = new Dog("zp",19,"student"); // 实例化对象时来调用初始化变量
  17. echo $dog->name;
  18. // echo $dog->job; // 报错啊,job是私有变量啊
  19. unset($dog); // 实例化对象内存被销毁

继承
在继承时,php子类的构造函数,会优先调用子类的构造函数

  1. class Animal{
  2. function __construct() {
  3. echo '我是父类构造函数';
  4. }
  5. }
  6. class Dog extends Animal{
  7. function __construct() {
  8. echo '我是子类构造函数';
  9. }
  10. }
  11. $dog = new Dog(); // 我是子类的构造函数

抽象类和接口,抽象类->抽象类中至少要包含一个抽象方法,抽象方法并没有方法体,方法体必须在子类中去实现,并且抽象类不可以被实例化。

  1. abstract class Animal{
  2. abstract function eat();
  3. }
  4. class Dog extends Animal{
  5. function eat () {
  6. echo "dog can eat...";
  7. }
  8. }
  9. $dog = new Dog();
  10. $dog = new Animal(); // 报错
  11. $dog->eat();

接口,用关键字interface来定义接口,接口中不会写任何的方法体,全部依靠类来实现,类实现接口用关键字implements

  1. interface IAnimal{
  2. function Eat();
  3. }
  4. class Dog implements IAnimal{
  5. public function Eat() {
  6. echo "dog can eat...";
  7. }
  8. }
  9. $dog = new Dog();
  10. $dog->Eat();

php只支持单继承,但是我们可以用接口来实现多继承:

  1. interface IAnimal{
  2. function Eat();
  3. }
  4. interface IDog{
  5. function Sleep();
  6. }
  7. class Dog implements IAnimal,IDog{
  8. public function Eat() {
  9. echo "dog can eat...";
  10. }
  11. public function Sleep() {
  12. echo "dog can sleep...";
  13. }
  14. }
  15. $dog = new Dog();
  16. $dog->Eat();
  17. $dog->Sleep();
0 0
原创粉丝点击