1. 程式人生 > >php面向對象精要(1)

php面向對象精要(1)

new abstract self () elf span truct nim enum

1、靜態屬性與方法

每一個類的實例擁有自己的屬性和方法,每一個類也可以包含靜態屬性,靜態屬性不屬於類的任何實例,可以把靜態屬性理解成存儲在類中的全局變量,可以在任何地方通過類名引用靜態屬性。

 1 <?php
 2 class MyClass {
 3     static $a = 0;    
 4     function getValue(){
 5         return self::$a;
 6     }
 7 }
 8 
 9 $obj = new MyClass();
10 echo $obj->getValue() . PHP_EOL
; 11 12 echo MyClass::$a . PHP_EOL; 13 ?>

2,靜態屬性的應用-----把一個唯一的id傳遞到類的所有實例中

<?php
    class MyClass {
        static $count = 0;
        public $unique_id;
        function __construct(){
            self::$count++;
            $this->unique_id = self::$count;
        }
    }
    
    
$obj1 = new MyClass(); echo $obj1->unique_id . PHP_EOL; $obj2 = new MyClass(); echo $obj2->unique_id . PHP_EOL; ?>

3,靜態方法

 1 <?php
 2     class HelloWorld {
 3         static function sayHello(){
 4             print "Hello World";
 5             self::printNewLine();
6 } 7 8 static function printNewLine(){ 9 echo PHP_EOL; 10 } 11 } 12 HelloWorld::sayHello(); 13 HelloWorld::sayHello(); 14 ?>

4,類的常量

>全局常量用 define函數定義

>類的常量與靜態成員類似,他們屬於類本身,而不是類的實例

>類的常量對大小寫敏感

<?php
    class MyColorEnumClass {
        const RED = "red";
        const GREEN = "green";
        const BLUE = "blue";

        static function printColor(){
            print self::RED . PHP_EOL;
            print self::GREEN . PHP_EOL;
            print self::BLUE . PHP_EOL;
        }
    }        
    
    MyColorEnumClass::printColor();
?>

5,對象克隆

在php5中,對象賦值,其實是引用 , 如果需要拷貝對象,用克隆關鍵字clone

<?php
    class MyClass {
        public $var = 1;
    }

    $obj1 = new MyClass();
    //$obj2 = $obj1;
    $obj2 = clone $obj1;
    $obj2->var = 2;
    //使用$obj2 = $obj1, 下面輸出2
    //使用$obj2 = clone $obj1, 下面輸出1
    echo $obj1->var . PHP_EOL;

?>

6,多態

下面這個實例,如果想要再增加一種動物,那麽需要改動2處,需要增加動物類和方法,而且需要在printTheRightSound方法中增加一個elseif分支,這種設計對於代碼維護和分離非常不友好

<?php
    class Cat{
        function miao(){
            echo "cat";
        }
    }

    class Dog{
        function wang(){
            echo "dog";
        }
    }

    function printTheRightSound( $obj ){
        if( $obj instanceof Cat ) {
            $obj->miao();
        }else if ( $obj instanceof Dog ) {
            $obj->wang();
        }else {
            echo "傳遞了錯誤的對象類型";
        }
        echo PHP_EOL;
    }

    printTheRightSound( new Cat() );
    printTheRightSound( new Dog() );
?>

我們可以用繼承的優勢,改造上面的缺點

 1 <?php
 2     abstract class Animal {
 3         abstract function makeSound();
 4     }
 5     class Cat extends Animal{
 6         function makeSound(){
 7             echo "cat";
 8         }
 9     }
10     class Dog extends Animal{
11         function makeSound(){
12             echo "dog";
13         }
14     }
15     class Chicken extends Animal {
16         function makeSound(){
17             echo "chicken";
18         }
19     }
20 
21     function printTheRightSound( $obj ){
22         if( $obj instanceof Animal ) {
23             $obj->makeSound();
24         }else {
25             echo "傳遞了錯誤的對象類型";
26         }
27         echo PHP_EOL;
28     }
29 
30     printTheRightSound( new Cat() );
31     printTheRightSound( new Dog() );
32     printTheRightSound( new Chicken() );
33 ?>

這樣改造之後,printTheRightSound就不需要改動,只需要添加對應的動物類和方法即可

php面向對象精要(1)