• 走入PHP-类与对象


    PHP中用class来定义类,用new实例化对象,用extends继承类,不过只能单继承,属性和方法有public、private和protected做访问控制,默认为public,在类里定义常量不需要$,用::范围解析符可以调用父类的方法,访问类的静态变量、静态方法和常量。

    每个类的定义都以关键字 class 开头,后面跟着类名,可以是任何非 PHP 保留字的名字。后面跟着一对花括号,里面包含有类成员和方法的定义。伪变量 $this 可以在当一个方法在对象内部调用时使用。$this 是一个到调用对象(通常是方法所属于的对象,但也可以是另一个对象,如果该方法是从第二个对象内静态调用的话)的引用。

     1 <?php
     2 class A
     3 {
     4   function foo()
     5   {
     6     if(isset($this)){
     7       echo '$this is defined (';
     8       echo get_class($this);
     9       echo ")
    ";
    10     }else{echo '$this is not defined';}  
    11   }
    12 }
    13 class B
    14 {
    15   function bar()
    16   {
    17     A::foo();
    18   }
    19 }
    20 $a = new A();
    21 $a->foo();
    22 A::foo();
    23 $b = new B();
    24 $b->bar();
    25 B::bar();
    26 ?>
    View Code

    =================================================

    简单的类定义:

    <?php
    class SimpleClass
    {
        // 成员声明
        public $var = 'a default value';
    
        // 方法声明
        public function displayVar() {
            echo $this->var;
        }
    }
    ?>
    View Code

    =================================================

    继承:

    一个类可以在声明中用 extends 关键字继承另一个类的方法和成员。PHP不支持多重继承,一个类只能继承一个基类。

    被继承的方法和成员可以通过用同样的名字重新声明被覆盖,除非父类定义方法时使用了 final 关键字。可以通过 parent:: 来访问被覆盖的方法或成员。 

    <?php
    class ExtendClass extends SimpleClass
    {
        // Redefine the parent method
        function displayVar()
        {
            echo "Extending class
    ";
            parent::displayVar();
        }
    }
    
    $extended = new ExtendClass();
    $extended->displayVar();
    ?>
    View Code

    ==================================================

    在类的成员方法里面,可以通过$this->property(property是属性名字)这种方式来访问类的属性、 方法,但是要访问类的静态属性或者在静态方法里面却不能使用,而是使用self::$property。

    ===================================================

    类常量:

    常量的值必须是一个定值,不能是变量,类属性或其它操作(如函数调用)的结果。

    <?php
    class MyClass
    {
        const constant = 'constant value';
    
        function showConstant() {
            echo  self::constant . "
    ";
        }
    }
    
    echo MyClass::constant . "
    ";
    
    $classname = "MyClass";
    echo $classname::constant . "
    "; // PHP 5.3.0之后
    
    $class = new MyClass();
    $class->showConstant();
    
    echo $class::constant."
    "; // PHP 5.3.0之后
    ?>
    View Code

    ===================================================

    构造函数:

    如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()。

    析构函数:

     和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。

    析构函数即使在使用 exit()终止脚本运行时也会被调用。在析构函数中 调用 exit()将会中止其余关闭操作的运行。

    ===================================================

    范围解析操作符(::)

    可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。 当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。

    self 和 parent 这两个特殊的关键字是用于在类的内部对成员或方法进行访问的。

    ===================================================

    static关键字:

    声明类成员或方法为static,就可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法除外)。

    由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。

    静态属性不可以由对象通过->操作符来访问。

    用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。

    就像其它所有的PHP静态变量一样,静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。 所以你可以把静态属性初始化为整型或数组,但不能指向另一个变量或函数返回值,也不能指向一个对象。

    ===================================================

    抽象类:

    PHP5 支持抽象类和抽象方法。定义为抽象的类可能无法直接被实例化,任何一个类, 如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。如果类方法被声明为抽象的, 那么其中就不能包括具体的功能实现。

    ===================================================

    接口:

    使用接口(interface),你可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。我们可以通过interface来定义一个接口,就像定义一个标准的类一样,但其中定义所有的方法都是空的。 接口中定义的所有方法都必须是public,这是接口的特性。

    要实现一个接口,可以使用implements操作符。类中必须实现接口中定义的所有方法,否则会报一个fatal错误。如果要实现多个接口,可以用逗号来分隔多个接口的名称。 

    Note: 实现多个接口时,接口中的方法不能有重名。 

    Note: 接口也可以继承,通过使用extends操作符。

    接口中也可以定义常量。接口常量和类常量的使用完全相同。

     1 <?php
     2 
     3 // 声明一个'iTemplate'接口
     4 interface iTemplate
     5 {
     6     public function setVariable($name, $var);
     7     public function getHtml($template);
     8 }
     9 
    10 
    11 // 实现接口
    12 // 下面的写法是正确的
    13 class Template implements iTemplate
    14 {
    15     private $vars = array();
    16 
    17     public function setVariable($name, $var)
    18     {
    19         $this->vars[$name] = $var;
    20     }
    21 
    22     public function getHtml($template)
    23     {
    24         foreach($this->vars as $name => $value) {
    25             $template = str_replace('{' . $name . '}', $value, $template);
    26         }
    27 
    28         return $template;
    29     }
    30 }
    31 
    32 // 下面的写法是错误的,会报错:
    33 // Fatal error: Class BadTemplate contains 1 abstract methods
    34 // and must therefore be declared abstract (iTemplate::getHtml)
    35 class BadTemplate implements iTemplate
    36 {
    37     private $vars = array();
    38 
    39     public function setVariable($name, $var)
    40     {
    41         $this->vars[$name] = $var;
    42     }
    43 }
    44 ?>
    View Code
  • 相关阅读:
    【Android】Android消息处理机制
    【Android】Sensor框架HAL层解读
    【Android】Sensor框架Framework层解读
    【流媒体】初识流媒体与流媒体技术
    【Git】Git与GitHub 入门
    【Delphi】基于状态机的串口通信
    【Delphi】SPComm注意事项
    【Android】事件输入系统-代码层次解读
    【Android】事件处理系统
    【Android】窗口机制分析与UI管理系统
  • 原文地址:https://www.cnblogs.com/niceforbear/p/4539193.html
Copyright © 2020-2023  润新知