php5 讀書心得

2021-08-22 11:12:53 字數 3578 閱讀 2955

由於工作中要用到php,最近下了本《php5 power programming》在讀,外文的,還不錯,打算寫些讀書心得,可能會零散些。這次講的是多型。

首先看乙個例子,是講動物發出的叫聲的。

class cat

} class dog

} function printtherightsound($obj)

else if ($obj instanceof dog) else

print "\n";

} printtherightsound(new cat());

printtherightsound(new dog());

這裡輸出的是:

miau(貓的叫聲)

wuff(狗的叫聲)

熟悉oop的都知道,這個例子擴充套件性不好,因為如果你要加入更多動物的話,需要用很多個if else來判斷,而且要重複寫很多**,有了多型後,就好辦了。php5中終於有多型這東西了,多個子類可以擴充套件繼承父類,上面的例子改寫如下:

class animal

} class cat extends animal

} class dog extends animal

} function printtherightsound($obj)

else

print "\n";

} printtherightsound(new cat());

printtherightsound(new dog());

可以看出,這個時候,無論增加什麼動物,printtherightsound方法是不需要 進行任何修改的了!當然,大家學過oop的可以看出,這個例子可以進一步修改,就是將animal宣告為抽象基類拉。

在oop中,建構函式和析構函式是很重要的,在php4中,可以用和類名相同的方法名稱來宣告建構函式,比如

class a

} 在php5中,是用新的關鍵字_construct來實現了,而析構函式則用__destruct()

比如乙個例子:

class person

function getname()

private $name;

}; $judy = new person("judy") . "\n";

$joe = new person("joe") . "\n";

print $judy->getname();

print $joe->getname();

今天講的是parent::和self::兩個新的關鍵字。self是用來引用當前類並且一般用來訪問靜態成員變數,parent::用來訪問父類,並且一般用來訪問父類的建構函式或者方法。有oop知識的朋友其實很容易理解,以下是例子:

class ancestor

} class child extends ancestor

} $obj = new child();

輸出是:

in ancestor constructor

in child constructor

1 instanceof操作

該操作中,判斷某個類是否是另乙個類的子類或判斷是否類的例項。比如考察下面的例子

class rectangle

class square extends rectangle

class circle

function checkifrectangle($shape) }

checkifrectangle(new square());

checkifrectangle(new circle());

其中square類繼承了rectangle類,而circle類則是單獨的。那麼,在checkifrectangle中,判斷傳入來的類是否rectangle的子類。結果輸出是'square is a rectangle\n'.

其中,_class_是乙個特殊的常量,表示的是當前類的名稱。

2 抽象類和介面

抽象類中,只定義了方法的宣告部分,而具體的實現是留給其子類去實現的。比如有如下的例子:

abstract class shape

abstract function draw();

protected $x, $y;

} class square extends shape

} class circle extends shape

} 其中,形狀類是基類,宣告了抽象的方法draw,因為不同的圖形有不同的「畫」的方法。接下來square和circle類都繼承了shape類, 並且各自實現了自己的draw方法。

當乙個抽象類的所有方法都是抽象的,那麼可以用介面來定義了。本質上來說,介面是一種特殊的抽象類,抽象類中只包含常量和方法的定義,而沒有變數和方法的實現。

比如下面的例子:

其中宣告了介面loggable,接下來person和product類都實現了其介面,但類a是單獨的,沒實現其介面,於是在主程式mylog中,分別判斷各物件是否loggable的子類。當然,對a,是輸出出錯資訊的。

3 _autoload()功能

我們在寫oop時,經常是這樣的,先比如在乙個目錄,如include下,先寫了很多個基本的類,然後在其他要應用這些類的程式中,用include("***/***x.php")的功能,來引入這些類。當工程很大時,有的時候經常會忘記include正確的類檔案進來了,而且很容易出錯。在php5中,增添了_autoload()功能了,比如乙個例子如下

myclass.php

<?php

class myclass

} general.inc:

<?php

function __autoload($class_name)

main.php:

<?php

require_once "general.inc";

$obj = new myclass();

$obj->printhelloworld();

?>

其中,假設在/classes目錄下,每個類假設以同名的方式命名php檔案,如乙個叫a的類,以a.php檔案來命名。在上面的例子中,在main.php中,沒有顯式生命類myclass,但是require了general.inc,在這個inc檔案中,使用了_autoload方法,自動去classes目錄下,找相應的類,這裡找到了myclass.php了。看,這樣就很方便了,不需要在main.php中,大量寫很多的include了,太方便拉

inte***ce loggable

class person implements loggable

} class product implements loggable

} class a }

function mylog($obj) else

} $person = new person();

// ...

$product = new product();

$a=new a();

mylog($person);

mylog($product);

mylog($a);

php5 讀書心得(1)

由於工作中要用到php,最近下了本 php5 power programming 在讀,外文的,還不錯,打算寫些讀書心得,可能會零散些。這次講的是多型。首先看乙個例子,是講動物發出的叫聲的。class cat class dog function printtherightsound obj els...

PHP5配置選項

在unix平台上安裝基本沒有變化 1.gunzip 5.x.x.tar.gz 2.tar xvf 5.x.x.tar 3.cd 5.x.x 4.configure 5.make 6.make install 7.apachectl restart configure 配置命令取決於安裝步驟可能需要另...

php5安裝詳解

對於apache2的設定 1 不要addmodule mod php5.c 2 loadmodule php5 module c php php5apache2.dll,是php5apache2.dll 3 需要將php目錄下的dll檔案 以下檔案不必複製 php5activescript.dll ...