首页 > 技术文章 > Php对象及对象特性篇

alihenaixiao 2016-08-27 15:04 原文

前言
以前写C++最多,大二课上学过Java。现在也差不多还给老师了。现在决定针对php重新梳理一遍,夯实基础,设计模式学起来应该会更加得心应手吧。
介绍
对象作为数据和功能代码的集合,是程序开发和代码从用的基本单位。
对象元素

访问方法或属性

  • $object->propertyname
    $object->methodname ([arg........])

访问标识符

类,方法,属性

  • public 可以从外部访问(未定义,默认为public)
  • private 只能在内部访问
  • protected 只能被对象自身的方法或者继承他的子类方法访问
  • 对象被创建后,就会通过引用传参,而不是复制整个对象。复制整个对象可以用clone关键字

方法,属性

  • static 通过类来调用,而不是对象,这种方法不能访问对象的属性
    HTML::p("hello world!!!"); //调用html类中的静态方法p()

  • final 子类无法重写final方法
    补充$this->是当前对象的引用,指向方法所属的对象 (static方法会失效)

常量

  • define() 全局常量
  • const 内部常量

类的特性

继承(extends)

  • parent::method ( ) ------------- 调用父类中被重写的方法
  • self:: method() -------------- 调用子类中方法

接口(implements)

  • 提供了定义一个类所遵循的规则的途径,提供了类的方法原型和常量,实现该接口的类必须提供接口中所有方法的具体实现
  • 接口可以继承于其他多个接口,只要他继承的接口声明的方法和子接口中的方法不重名。
  • 语法:
      interface interfacename{
        [function functionname();
         ......
        ]
      }
      
      class classname implements interfacename{
        ......
      }

特征(trait)

  • 允许在不需要创建一个父类的情况下,便可以在不同层次结构的类中复用类外部的代码
  • 语法:
      trait Logger{
        pubilc log ($logString){
        $className = __CLASS__;
        echo "[{$className}]{$logString}";
      }
      }
      
      class User {
        use Logger;
        public $name;
        function __construct($name=''){
          $this->name = $name;
          $this->log("Created user '{$this->name}'");
      }
      }
      
      $user = new User('Alex');		// [User] Created user 'Alex'
      //Logger方法是一个trait, 在UserGroup类实例中是可访问的,就像在类内部定义的方法一样
      //trait也可以同时使用多个 ------- use trait1, trait2,.......

一个方法中使用多个trait,方法名有可能冲突:

      trait Command{
        function run(){
        ......
      }
      }
      
      trait Marathon{
        function run(){
        ......
      }
      }
      
      class Person{
        use Command, Marathon{
        Marathom::run instreadof Conmand;		//用Marathon中的run方法,覆盖Command的run方法
      }
      }
      
      class Person2{
        use Command, Marathon{
        Command::run as runCommand;	//Command中run方法命名为runCommand
        Marathon::run instreadof Command;		//覆盖掉Command中run方法
      }
      }

抽象类(abstract)

  • 父类中只提供方法名,没有具体实现,子类中必须实现父类中的抽象方法,trait中有抽象方法的话,也必须在子类中实现。(抽象类中可能有实现过的函数)
  • 抽象类不可以实例化

函数

构造函数

  • 用来在实例化类的时候初始化类对象的特殊函数
  • php不支持构造函数链的自动调用,可以手动在子类构造函数中显式的调用父类构造函数
  • 语法:
      function __construct() {
        ......
      }

析构函数

  • 在对象被销毁时(一个对象的最后一个引用被删除),或者脚本执行结束时,被调用来收回对象的资源。
  • 语法:
      function __destruct() {
        ......
      }

推荐阅读