php面向對象精要(1)
阿新 • • 發佈:2018-02-22
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)