本文目錄一覽:
- 1、php4與php5區別具體有哪些?
- 2、PHP里$_SERVER[‘HTTP_HOST’]和$_SERVER[‘PHP_SELF’]區別
- 3、請詳細說明一下php5中的魔術方法
- 4、如何運用PHP函數array
- 5、PHP $this返回對象
- 6、php 中的魔術函數都有哪些?
php4與php5區別具體有哪些?
新的對象模式
PHP5 中的對象已經進行了較系統、較全面的調整,現在的樣子可能看起來會有些類似於 Java。本小節着重講述 PHP5 中新的對象模式,並舉了一些較簡易的例子來說明。就讓本節成為你的 PHP5 之旅的一個新起點吧。:)
* 構造函數和析構函數
* 對象的引用
* 對象的克隆
* 對象中的私有、公共及受保護模式
* 接口 (Interfaces)
* 抽象類
* __call
* __set 和 __get
* 靜態成員
構造函數和析構函數
在 PHP4 中,當函數與對象同名時,這個函數將成為該對象的構造函數,並且在 PHP4 中沒有析構函數的概念。
在 PHP5 中,構造函數被統一命名為 __construct,並且引入了析構函數的概念,被統一命名為 __destruct。
例一:構造函數和析構函數
?php
class foo {
var $x;
function __construct($x) {
$this-x = $x;
}
function display() {
print($this-x);
}
function __destruct() {
print(“bye bye”);
}
}
$o1 = new foo(4);
$o1-display();
?
在上面的例子中,當你終止調用 foo 類的時候,其析構函數將會被調用,上例中會輸出 “bye bye”。
對象的引用
眾所周知,在PHP4 中,傳遞變量給一個函數或方法,實際是把這個變量做了一次複製,也就意味着你傳給函數或方法的是這個變量的一個副本,除非你使用了引用符號 “” 來聲明是要做一個引用,而不是一個 Copy。在 PHP5 中,對象總是以引用的形式存在的,對象中的賦值操作同樣也都是一個引用操作。
例二:對象的引用
?php
class foo {
var $x;
function setX($x) {
$this-x = $x;
}
function getX() {
return $this-x;
}
}
$o1 = new foo;
$o1-setX(4);
$o2 = $o1;
$o1-setX(5);
if($o1-getX() == $o2-getX()) print(“Oh my god!”);
?
對象的克隆
如上所述,當一個對象始終以引用的形式來被調用時,如果我想得到該對象的一個副本,該怎麼辦呢?PHP5 提供了一個新的功能,就是對象的克隆,語法為 __clone。
例三:對象的克隆
?php
class foo {
var $x;
function setX($x) {
$this-x = $x;
}
function getX() {
return $this-x;
}
}
$o1 = new foo;
$o1-setX(4);
$o2 = $o1-__clone();
$o1-setX(5); if($o1-getX() != $o2-getX()) print(”Copies are independant”);
?
對象克隆的方法在其它很多應用程序語言中都是存在的,所以你不必擔心它的穩定性。:)
對象中的私有、公共及保護模式
PHP4 中,一個對象的所有方法和變量都是公共的,這意味着你可以在一個對象的外部操作其中的任意一個變量和方法。PHP5 引入了三種新的用來控制這種存取權限的模式,它們是:公共的(Public)、受保護的(Protected)及私有的(Private)。
公共模式(Public):允許在對象外部進行操作控制。
私有模式(Private):只允許本對象內的方法對其進行操作控制。
受保護模式(Protected):允許本對象及其父對象對其進行操作控制。
例四: 對象中的私有、公共及受保護模式
?php
class foo {
private $x;
public function public_foo() {
print(“I’m public”);
}
protected function protected_foo() {
$this-private_foo(); //Ok because we are in the same class we can call private methods
print(”I’m protected”);
}
private function private_foo() {
$this-x = 3;
print(”I’m private”);
}
}
class foo2 extends foo {
public function display() {
$this-protected_foo();
$this-public_foo();
// $this-private_foo(); // Invalid! the function is private in the base class
}
} $x = new foo();
$x-public_foo();
//$x-protected_foo(); //Invalid cannot call protected methods outside the class and derived classes
//$x-private_foo(); //Invalid private methods can only be used inside the class $x2 = new foo2();
$x2-display();
?
提示:對象中的變量總是以私有形式存在的,直接操作一個對象中的變量不是一個好的面向對象編程的習慣,更好的辦法是把你想要的變量交給一個對象的方法去處理。
接口 (Interfaces)
眾所周知,PHP4 中的對象支持繼承,要使一個對象成為另一個對象的派生類,你需要使用類似 “class foo extends parent” 的代碼來控制。 PHP4 和 PHP5 中,一個對象都僅能繼承一次,多重繼承是不被支持的。不過,在 PHP5 中產生了一個新的名詞:接口,接口是一個沒有具體處理代碼的特殊對象,它僅僅定義了一些方法的名稱及參數,此後的對象就可以方便的使用 ‘implement’ 關鍵字把需要的接口整合起來,然後再加入具體的執行代碼。
例五:接口
?php
interface displayable {
function display();
}
interface printable {
function doprint();
}
class foo implements displayable,printable {
function display() {
// code
} function doprint() {
// code
}
}
?
這對提高代碼的可讀性及通俗性有很大的幫助,通過上面的例子可以看到,對象 foo 包含了 displayable 和 printable 兩個接口,這時我們就可以清楚的知道,對象 foo 一定會有一個 display() 方法和一個 print() 方法,只需要去了解接口部分,你就可以輕易的操作該對象而不必去關心對象的內部是如何運作的。
抽象類
抽象類不能被實例化。
抽象類與其它類一樣,允許定義變量及方法。
抽象類同樣可以定義一個抽象的方法,抽象類的方法不會被執行,不過將有可能會在其派生類中執行。
例六:抽象類
?php
abstract class foo {
protected $x;
abstract function display();
function setX($x) {
$this-x = $x;
}
}
class foo2 extends foo {
function display() {
// Code
}
}
?
__call
PHP5 的對象新增了一個專用方法 __call(),這個方法用來監視一個對象中的其它方法。如果你試着調用一個對象中不存在的方法,__call 方法將會被自動調用。
例七:__call
?php
class foo {
function __call($name,$arguments) {
print(”Did you call me? I’m $name!”);
}
} $x = new foo();
$x-doStuff();
$x-fancy_stuff();
?
這個特殊的方法可以被用來實現“過載(overloading)”的動作,這樣你就可以檢查你的參數並且通過調用一個私有的方法來傳遞參數。
例八:使用 __call 實現“過載”動作
?php
class Magic {
function __call($name,$arguments) {
if($name==’foo’) {
if(is_int($arguments[0])) $this-foo_for_int($arguments[0]);
if(is_string($arguments[0])) $this-foo_for_string($arguments[0]);
}
} private function foo_for_int($x) {
print(”oh an int!”);
} private function foo_for_string($x) {
print(”oh a string!”);
}
} $x = new Magic();
$x-foo(3);
$x-foo(”3″);
?
__set 和 __get
這是一個很棒的方法,__set 和 __get 方法可以用來捕獲一個對象中不存在的變量和方法。
例九: __set 和 __get
?php
class foo {
function __set($name,$val) {
print(”Hello, you tried to put $val in $name”);
}
function __get($name) {
print(”Hey you asked for $name”);
}
}
$x = new foo();
$x-bar = 3;
print($x-winky_winky);
?
類型指示
在 PHP5 中,你可以在對象的方法中指明其參數必須為另一個對象的實例。
例十:類型指示
?php
class foo {
// code …
}
class bar {
public function process_a_foo(foo $foo) {
// Some code
}
}
$b = new bar();
$f = new foo();
$b-process_a_foo($f);
?
可以看出,我們可以顯性的在參數前指明一個對象的名稱,PHP5 會識別出這個參數將會要是一個對象實例。
靜態成員
靜態成員和靜態方法在面象對象編程的術語中被稱作 “對象方法(class methods)” 和 “對象變量(class variables)”。
“對象方法” 在一個對象沒有實例化前允許被調用。同樣,“對象變量” 在一個對象沒有實例化前可以被獨立操作控制(不需要用一個對象的方法來控制)。
例十一:對象方法和對象變量
?php
class calculator {
static public $pi = 3.14151692;
static public function add($x,$y) {
return $x + $y;
}
}
$s = calculator::$pi;
$result = calculator::add(3,7);
print(”$result”);
?
異常處理
異常處理是公認的處理程序錯誤的理想方法,在 Java 及 C++ 中都有這個概念,我們欣喜的看到,在 PHP5 已經加入了這方面的應用。你可以嘗試使用 “try” 和 “catch” 來控制程序的錯誤。
例十二:異常處理
?php
class foo {
function divide($x,$y) {
if($y==0) throw new Exception(“cannot divide by zero”);
return $x/$y;
}
}
$x = new foo();
try {
$x-divide(3,0);
} catch (Exception $e) {
echo $e-getMessage();
echo “n
n”;
// Some catastrophic measure here
}
?
上例中,我們使用了 “try” 來執行花括號中的語句,當有錯誤發生的時候,代碼會把錯誤交給 “catch” 子句來處理,在 “catch” 子句中,你需要指明要把錯誤交給某個對象處理,這樣做可以使代碼結構看起來更清晰,因為現在我們可以把所有的錯誤信息交給一個對象來處理。
自定義錯誤處理
你可以很方便的用自定義的處理錯誤的代碼來控制你的程序中的意外。你僅僅需要從異常類中派生出一個自己的錯誤控制類,在你自己的錯誤控制類中,你需要有一個構造函數和一個 getMessage 方法,以下是一個例子。
例十三:自定義錯誤處理
?php
class WeirdProblem extends Exception {
private $data;
function WeirdProblem($data) {
parent::exception();
$this-data = $data;
}
function getMessage() {
return $this-data . ” caused a weird exception!”;
}
}
?
現在我們可以使用 “throw new WeirdProblem($foo)” 來拋出一個錯誤句柄,如果錯誤在 “try” 的代碼塊中發生,PHP5 會自動把錯誤交給 “catch” 部分來處理。
名稱空間
名稱空間對類的分組或函數分組很有用。它可以把一些相關的類或函數給組合到一起,方便以後調用。
例十四:名稱空間
?php
namespace Math {
class Complex {
//…code…
function __construct() {
print(”hey”);
}
}
} $m = new Math::Complex();
?
注意你需要在何種情況下使用名稱空間,在實際運用中,你可能會需要聲明兩個或多個名稱一樣的對象來做不同的事情,那麼你就可以把他們分別放到不同的名稱空間中去(但接口是要相同的)。
PHP里$_SERVER[‘HTTP_HOST’]和$_SERVER[‘PHP_SELF’]區別
兩者的區別在於含義不同:
假如命令行的地址是:xxx
那麼:$_SERVER[‘HTTP_HOST’]==”$_SERVER[‘PHP_SELF’]==’/index.php’所以前者是主機地址,後者是腳本文件的絕對路徑。
擴展資料:
1、新對象模式
*構造函數和析構函數 * 對象的引用 * 對象的克隆 * 對象中的私有、公共及受保護模式 * 接口 (Interfaces)
* 抽象類 * __call * __set 和 __get * 靜態成員
2、構造函數和析構函數
在 PHP4 中,當函數與對象同名時,這個函數將成為該對象的構造函數,並且在 PHP4 中沒有析構函數的概念。
在 PHP5 中,構造函數被統一命名為 __construct,並且引入了析構函數的概念,被統一命名為 __destruct。
3、對象的引用
在PHP4中,傳遞變量給一個函數或方法,實際是把這個變量做了一次複製,也就意味着你傳給函數或方法的是這個變量的一個副本,除非你使用了引用符號“;” 來聲明是要做一個引用,而不是一個 Copy。在 PHP5中,對象總是以引用的形式存在的,對象中的賦值操作同樣也都是一個引用操作。
4、對象的克隆
當一個對象始終以引用的形式來被調用時,如果我想得到該對象的一個副本,該怎麼辦呢?PHP5 提供了一個新的功能,就是對象的克隆,語法為 __clone。
5、抽象類
抽象類不能被實例化。
抽象類與其它類一樣,允許定義變量及方法。
抽象類同樣可以定義一個抽象的方法,抽象類的方法不會被執行,不過將有可能會在其派生類中執行。
6、__call
PHP5 的對象新增了一個專用方法 __call(),這個方法用來監視一個對象中的其它方法。如果你試着調用一個對象中不存在的方法,__call 方法將會被自動調用。
參考資料:百度百科——PHP
請詳細說明一下php5中的魔術方法
PHP處理對象部分的內核完全重新開發過,提供更多功能的同時也提高了性能。在以前版本的php中,處理對象和處理基本類型(數字,字符串)的方式是一樣的。這種方式的缺陷是:當將對象賦值給一個變量時,或者通過參數傳遞對象時,對象將被完全拷貝一份。在新的版本里,上述操作將傳遞引用(可以把引用理解成對象的標識符),而非值。
很多PHP程序員可能甚至沒有察覺到老的對象處理方式。事實上,大多數的php應用都可以很好地運行。或者僅僅需要很少的改動。
私有和受保護成員
PHP5引入了私有和受保護成員變量的概念。我們可以用它來定義類成員的可見性。
例子
受保護成員可以被子類訪問, 而私有成員只能被類本身訪問。
代碼:——————————————————————————–
?php
class MyClass {
private $Hello = “Hello, World!\n”;
protected $Bar = “Hello, Foo!\n”;
protected $Foo = “Hello, Bar!\n”;
function printHello() {
print “MyClass::printHello() ” . $this-Hello;
print “MyClass::printHello() ” . $this-Bar;
print “MyClass::printHello() ” . $this-Foo;
}
}
class MyClass2 extends MyClass {
protected $Foo;
function printHello() {
MyClass::printHello(); /* Should print */
print “MyClass2::printHello() ” . $this-Hello; /* Shouldn’t print out anything */
print “MyClass2::printHello() ” . $this-Bar; /* Shouldn’t print (not declared)*/
print “MyClass2::printHello() ” . $this-Foo; /* Should print */
}
}
$obj = new MyClass();
print $obj-Hello; /* Shouldn’t print out anything */
print $obj-Bar; /* Shouldn’t print out anything */
print $obj-Foo; /* Shouldn’t print out anything */
$obj-printHello(); /* Should print */
$obj = new MyClass2();
print $obj-Hello; /* Shouldn’t print out anything */
print $obj-Bar; /* Shouldn’t print out anything */
print $obj-Foo; /* Shouldn’t print out anything */
$obj-printHello();
?
——————————————————————————–
私有方法和受保護方法
PHP5也引入了私有方法和受保護方法的概念。
例子:
代碼:——————————————————————————–
?php
class Foo {
private function aPrivateMethod() {
echo “Foo::aPrivateMethod() called.\n”;
}
protected function aProtectedMethod() {
echo “Foo::aProtectedMethod() called.\n”;
$this-aPrivateMethod();
}
}
class Bar extends Foo {
public function aPublicMethod() {
echo “Bar::aPublicMethod() called.\n”;
$this-aProtectedMethod();
}
}
$o = new Bar;
$o-aPublicMethod();
?
——————————————————————————–
以前的不使用類的老代碼,沒有訪問修飾符(public, protected, private)的代碼可以不經改動運行。
抽象類和抽象方法
Php5也引入了抽象類和抽象方法的概念。抽象方法只是聲明了方法的簽名並不提供它的實現。包含抽象方法的類必須被聲明成抽象類。
例子:
代碼:——————————————————————————–
?php
abstract class AbstractClass {
abstract public function test();
}
class ImplementedClass extends AbstractClass {
public function test() {
echo “ImplementedClass::test() called.\n”;
}
}
$o = new ImplementedClass;
$o-test();
?
——————————————————————————–
抽象類不能被實例化。以前的不使用抽象類的老代碼可以不經改動運行。
接口
Php5引入了接口。一個類可以實現多個接口。
例子:
代碼:——————————————————————————–
?php
interface Throwable {
public function getMessage();
}
class MyException implements Throwable {
public function getMessage() {
// …
}
}
?
——————————————————————————–
以前的不使用接口的老代碼可以不經改動運行
類的型別提示
PHP5依然是弱類型的,不過在定義函數參數時,可以使用類的型別提示來聲明期望傳入的對象類型
Example
代碼:——————————————————————————–
?php
interface Foo {
function a(Foo $foo);
}
interface Bar {
function b(Bar $bar);
}
class FooBar implements Foo, Bar {
function a(Foo $foo) {
// …
}
function b(Bar $bar) {
// …
}
}
$a = new FooBar;
$b = new FooBar;
$a-a($b);
$a-b($b);
?
——————————————————————————–
和其他強類型語言一樣,php5類的型別提示在運行期間檢查而非編譯期間檢查。即:
代碼:——————————————————————————–
?php
function foo(ClassName $object) {
// …
}
?
和下面的代碼是一樣的:
?php
function foo($object) {
if (!($object instanceof ClassName)) {
die(“Argument 1 must be an instance of ClassName”);
}
}
?
——————————————————————————–
這個語法只適用於類,不適用於內建類型。
Final
PHP 5 引入了final關鍵字來聲明final成員和final方法。final成員和final方法不能被子類覆蓋。
Example
代碼:——————————————————————————–
?php
class Foo {
final function bar() {
// …
}
}
?
——————————————————————————–
更進一步,可以把類聲明成final。將類聲明成final可以阻止這個類被繼承。final類裡面的方法缺省地都是final的,無需再聲明一次。
Example
代碼:——————————————————————————–
?php
final class Foo {
// class definition
}
// the next line is impossible
// class Bork extends Foo {}
?
——————————————————————————–
屬性不能定義成為final.
以前的不使用final的老代碼可以不經改動運行.
對象克隆
Php4沒有提供一種機制來讓用戶自己定義複製構造子(copy constructor)控制對象的複製過程。Php4做二進制的拷貝,因而很精確地複製了對象的所有屬性。
精確地複製對象的所有屬性可能並不是我們一直想要的。有個例子可以很好地說明我們確實需要複製構造子:比如一個GTK Window的對象 a。 a持有它所需要的全部資源。當複製的這個GTK Window到對象b時候,我們更希望b持有新的資源對象。再舉個例子:對象a包含了一個對象c, 當你把對象a 複製到對象c的時候。我們可能更希望對象b包含一個新的對象c的copy, 而不是一個對象c的引用。(譯者註:這裡所說的就是淺克隆和深克隆。)
對象的複製是通過clone這個關鍵字達到的(Clone調用被克隆對象的__clone()方法)。對象的__clone方法不能夠直接被調用。
代碼:——————————————————————————–
?php
$copy_of_object = clone $object;
?
——————————————————————————–
當developer創建對象的一份拷貝的時候,php5將會檢查 __clone()方法是否存在。如果不存在,那麼它就會呼叫缺省的__clone()方法,複製對象的所有屬性。如果__clone()方法已經定義過,那麼_clone()方法就會負責設置新對象的屬性。為了方便起見,Engine會缺省地複製所有的屬性。所以在__clone()方法中,只需要覆蓋那些需要更改的屬性就可以了。如下:
Example
代碼:——————————————————————————–
?php
class MyCloneable {
static $id = 0;
function MyCloneable() {
$this-id = self::$id++;
}
function __clone() {
$this-address = “New York”;
$this-id = self::$id++;
}
}
$obj = new MyCloneable();
$obj-name = “Hello”;
$obj-address = “Tel-Aviv”;
print $obj-id . “\n”;
$obj_cloned = clone $obj;
print $obj_cloned-id . “\n”;
print $obj_cloned-name . “\n”;
print $obj_cloned-address . “\n”;
?
——————————————————————————–
統一構造函數
Php5允許開發者聲明一個類的構造方法。擁有構造方法的類在每次創建新的對象的時候都會呼叫這個方法,因此構造方法適合對象在被使用之前的初始化工作
Php4中,構造方法的名稱和類的名稱一樣。考慮到從子類構造方法呼叫父類構造方法的情況是非常普遍的,而將類從一個繼承體系中搬遷引起的父類變更就常常導致需要更改類的構造方法,php4的做法顯然是不太合理的。
Php5引入了一個聲明構建函數的標準方法: __construct().如下:
Example
代碼:——————————————————————————–
?php
class BaseClass {
function __construct() {
print “In BaseClass constructor\n”;
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print “In SubClass constructor\n”;
}
}
$obj = new BaseClass();
$obj = new SubClass();
?
——————————————————————————–
為保持向後的兼容性,如果php5不能夠找到 __construct(),它會尋找老式的構造方法,即與類同名的方法。簡單的說,只有當老代碼里包含了一個__construct()方法的時候,才存在一個兼容性的問題。
析構方法
對於面向對象的編程來說,可以定義析構方法是非常有用的一個功能。析構方法可以用來記錄調試信息,關閉數據庫連接等等一些清除收尾的工作。Php4中沒有析構方法,儘管php4已經支持可以註冊一個函數以便請求結束的時候被調用。
Php5引進的析構方法的概念和其他面向對象的語言(比如java)是一致的。當指向這個對象的最後一個引用被銷毀的時候,析構方法被調用,調用完成後釋放內存。注意:析構方法不接受任何參數。
Example
代碼:——————————————————————————–
?php
class MyDestructableClass {
function __construct() {
print “In constructor\n”;
$this-name = “MyDestructableClass”;
}
function __destruct() {
print “Destroying ” . $this-name . “\n”;
}
}
$obj = new MyDestructableClass();
?
——————————————————————————–
和構建方法一樣,父類的析構方法也不會被隱含調用。子類可以在自己的析構方法通過調用parent::__destruct()來顯式地調用它。
Constants
Php5引入了class級別的常量。
代碼:——————————————————————————–
?php
class Foo {
const constant = “constant”;
}
echo “Foo::constant = ” . Foo::constant . “\n”;
?
——————————————————————————–
老的沒有使用const的代碼仍然正常運行。
Exceptions
Php4沒有異常控制。Php5引入了和其它語言(java)相似的異常控制模式。應該注意的是php5裡面支持捕捉全部異常,但是不支持finally子句。
在catch語句塊裡面,可以重新拋出異常。也可以有多個catch語句,在這種情況下,被捕捉到的異常從上往下依次比較和catch語句比較異常,第一個類型匹配的catch語句將會被執行。如果一直搜索到底還沒有發現匹配的catch子句,則尋找下一個try/catch語句。最後不能捕捉的異常將被顯示出來。如果異常被捕捉,那麼程序會接着catch語句塊的下面開始執行。
Example
代碼:——————————————————————————–
?php
class MyException {
function __construct($exception) {
$this-exception = $exception;
}
function Display() {
print “MyException: $this-exception\n”;
}
}
class MyExceptionFoo extends MyException {
function __construct($exception) {
$this-exception = $exception;
}
function Display() {
print “MyException: $this-exception\n”;
}
}
try {
throw new MyExceptionFoo(‘Hello’);
}
catch (MyException $exception) {
$exception-Display();
}
catch (Exception $exception) {
echo $exception;
}
?
——————————————————————————–
上面的例子表明可以定義一個並不繼承自 Exception的異常類,但是,最好還是從Exception繼承並定義自己的異常。這是因為系統內建的Exception類能夠收集到很多有用的信息, 而不繼承它的異常類是得不到這些信息的。下面的php代碼模仿了系統內建Exception類。每個屬性後面都加了注釋。每個屬性都有一個getter,由於這些getter方法經常被系統內部處理調用,所以這些方法被標明了final。
Example
代碼:——————————————————————————–
?php
class Exception {
function __construct(string $message=NULL, int code=0) {
if (func_num_args()) {
$this-message = $message;
}
$this-code = $code;
$this-file = __FILE__; // of throw clause
$this-line = __LINE__; // of throw clause
$this-trace = debug_backtrace();
$this-string = StringFormat($this);
}
protected $message = ‘Unknown exception’; // exception message
protected $code = 0; // user defined exception code
protected $file; // source filename of exception
protected $line; // source line of exception
private $trace; // backtrace of exception
private $string; // internal only!!
final function getMessage() {
return $this-message;
}
final function getCode() {
return $this-code;
}
final function getFile() {
return $this-file;
}
final function getTrace() {
return $this-trace;
}
final function getTraceAsString() {
return self::TraceFormat($this);
}
function _toString() {
return $this-string;
}
static private function StringFormat(Exception $exception) {
// … a function not available in PHP scripts
// that returns all relevant information as a string
}
static private function TraceFormat(Exception $exception) {
// … a function not available in PHP scripts
// that returns the backtrace as a string
}
}
?
——————————————————————————–
如果我們定義的一異常類都是繼承自Exception基類
無兼容性問題。老的代碼不會受到這一特性的影響。
Dereferencing objects returned from functions
Php4中不能再次引用函數返回的對象以進一步呼叫返回對象的方法,而php5是可以的。
代碼:——————————————————————————–
?php
class Circle {
function draw() {
print “Circle\n”;
}
}
class Square {
function draw() {
print “Square\n”;
}
}
function ShapeFactoryMethod($shape) {
switch ($shape) {
case “Circle”:
return new Circle();
case “Square”:
return new Square();
}
}
ShapeFactoryMethod(“Circle”)-draw();
ShapeFactoryMethod(“Square”)-draw();
?
——————————————————————————–
靜態成員變量能夠被初始化。
Example
代碼:——————————————————————————–
?php
class foo {
static $my_static = 5;
public $my_prop = ‘bla’;
}
print foo::$my_static;
$obj = new foo;
print $obj-my_prop;
?
——————————————————————————–
靜態方法
PHP 5 引入了靜態方法,可以在不實例化類的情況下呼叫靜態方法。
Example
代碼:——————————————————————————–
?php
class Foo {
public static function aStaticMethod() {
// …
}
}
Foo::aStaticMethod();
?
——————————————————————————–
偽變量$this不能夠在靜態方法方法中使用。
instanceof
Php5引入了instanceof關鍵字,允許用它來測試一個對象是一個類的實例,或者是一個派生類的實例,或者實現了某個接口
Example
代碼:——————————————————————————–
?php
class baseClass { }
$a = new baseClass;
if ($a instanceof baseClass) {
echo “Hello World”;
}
?
——————————————————————————–
Static function variables
現在,靜態變量在編譯階段處理。因此程序員可以通過引用為靜態變量賦值。這可以改善性能,不過,不能夠使用對靜態變量的間接引用了。
按引用傳遞的函數參數現在也可以設置缺省值了。
Example
代碼:——————————————————————————–
?php
function my_function($var = null) {
if ($var === null) {
die(“$var needs to have a value”);
}
}
?
——————————————————————————–
__autoload()
__autoload() 攔截函數在一個未聲明的類被初始化的時候自動調用。該類的名字會被自動傳遞給__autoload()函數。而__autoload()也只有這麼唯一的一個參數。
Example
代碼:——————————————————————————–
?php
function __autoload($className) {
include_once $className . “.php”;
}
$object = new ClassName;
?
——————————————————————————–
可重載的方法呼叫和屬性訪問
方法呼叫和屬性訪問都能夠通過__call, __get() and __set()方法重載。
Example: __get() and __set()
代碼:——————————————————————————–
?php
class Setter {
public $n;
public $x = array(“a” = 1, “b” = 2, “c” = 3);
function __get($nm) {
print “Getting [$nm]\n”;
if (isset($this-x[$nm])) {
$r = $this-x[$nm];
print “Returning: $r\n”;
return $r;
} else {
print “Nothing!\n”;
}
}
function __set($nm, $val) {
print “Setting [$nm] to $val\n”;
if (isset($this-x[$nm])) {
$this-x[$nm] = $val;
print “OK!\n”;
} else {
print “Not OK!\n”;
}
}
}
$foo = new Setter();
$foo-n = 1;
$foo-a = 100;
$foo-a++;
$foo-z++;
var_dump($foo);
?
——————————————————————————–
Example: __call()
代碼:——————————————————————————–
?php
class Caller {
private $x = array(1, 2, 3);
function __call($m, $a) {
print “Method $m called:\n”;
var_dump($a);
return $this-x;
}
}
$foo = new Caller();
$a = $foo-test(1, “2”, 3.4, true);
var_dump($a);
?
——————————————————————————–
迭代
當和foreach一起使用對象的時候,迭代的方式被重載過了。缺省的行為是迭代類的所有屬性。
Example
代碼:——————————————————————————–
?php
class Foo {
public $x = 1;
public $y = 2;
}
$obj = new Foo;
foreach ($obj as $prp_name = $prop_value) {
// using the property
}
?
——————————————————————————–
一個類的所有對象都能夠被迭代瀏覽到, 如果這個類實現了一個空的接口:Traversable. 換句話說,實現了Traversable接口的類可以和foreach一起使用。
接口 IteratorAggregate 和Iterator允許指定類的對象在代碼中如何迭代。IteratorAggregate接口有一個方法:getIterator() 必須返回一個數組
Example
代碼:——————————————————————————–
?php
class ObjectIterator implements Iterator {
private $obj;
private $num;
function __construct($obj) {
$this-obj = $obj;
}
function rewind() {
$this-num = 0;
}
function valid() {
return $this-num $this-obj-max;
}
function key() {
return $this-num;
}
function current() {
switch($this-num) {
case 0: return “1st”;
case 1: return “2nd”;
case 2: return “3rd”;
default: return $this-num.”th”;
}
}
function next() {
$this-num++;
}
}
class Object implements IteratorAggregate {
public $max = 3;
function getIterator() {
return new ObjectIterator($this);
}
}
$obj = new Object;
// this foreach …
foreach($obj as $key = $val) {
echo “$key = $val\n”;
}
// matches the following 7 lines with the for directive.
$it = $obj-getIterator();
for($it-rewind(); $it-hasMore(); $it-next) {
$key = $it-current();
$val = $it-key();
echo “$key = $val\n”;
}
unset($it);
?
——————————————————————————–
新的__toString方法
可以通過覆蓋__toString方法來控制對象到字符串的轉換。
Example
代碼:—————————————
如何運用PHP函數array
PHP有一個系統函數is_array()可以判斷一個值是否在數組中。
語法如下:
in_array(value,array,type)
return boolen
參數說明:
value :要搜索的值
array : 被搜索的數組
type : 類型,true全等 ,false非全等(默認)
示例一:普通使用
代碼:
$str = 1;
$arr = array(1,3,5,7,9);
$boolvalue = in_array($str,$arr);
var_dump($boolvalue);
執行結果:
bool(true)
實例二:使用第三個參數
非全等
代碼:
$str = ‘1’;
$arr = array(1,3,5,7,9);
$boolvalue = in_array($str,$arr,false);
var_dump($boolvalue);
執行結果:
bool(true)
全等
代碼:
$str = ‘1’;
$arr = array(1,3,5,7,9);
$boolvalue = in_array($str,$arr,true);
var_dump($boolvalue);
執行結果:
bool(false)
實例三:克隆對象
代碼:
class a {
public $a = 1;
public function fun(){
return $this-a;
}
}
class b {
public $a = 2;
public function fun(){
return $this-a;
}
}
$a = new a();
$b = new b();
$c = clone $a;
$arr = array($a,$b);
$boolvalue = in_array($c,$arr,false);
var_dump($boolvalue);
執行結果:
bool(true)
代碼:
class a {
public $a = 1;
public function fun(){
return $this-a;
}
}
class b {
public $a = 2;
public function fun(){
return $this-a;
}
}
$a = new a();
$b = new b();
$c = clone $a;
$arr = array($a,$b);
$boolvalue = in_array($c,$arr,true);
var_dump($boolvalue);
執行結果:
bool(false)
示例四:多維數組
代碼:
$str = 10;
$arr = array(
array(1,2,3,4),
array(5,6,7,8,9),
10
);
$boolvalue = in_array($str,$arr);
var_dump($boolvalue);
執行結果:
bool(true)
代碼:
$str = 10;
$arr = array(
array(1,2,3,4),
array(5,6,7,8,9,10),
);
$boolvalue = in_array($str,$arr);
var_dump($boolvalue);
執行結果:
bool(false)
PHP $this返回對象
$this 就是”指這“的意思, 比方說你有個類叫“aaa”
當你實例化aaa這個類 $a = new aaa(); 之後 $this 就是指向 $a 對象。
this就是指向當前對象實例的指針,不指向任何其他對象或類。
至於什麼情況下要用return $this,應該沒有這樣, 我只知道有一些地方會用到$this取該對象的地址然後進行對象複製。 具體你可以去看下dedecms的mysql類,我記得那裡面對數據的操作就是這樣用的。
php 中的魔術函數都有哪些?
魔術函數1。__construct()
實例化對象時被調用,
當__construct和以類名為函數名的函數同時存在時,__construct將被調用,另一個不被調用。2。__destruct()
當刪除一個對象或對象操作終止時被調用。3。__call()
對象調用某個方法,
若方法存在,則直接調用;
若不存在,則會去調用__call函數。4。__get()
讀取一個對象的屬性時,
若屬性存在,則直接返回屬性值;
若不存在,則會調用__get函數。5。__set()
設置一個對象的屬性時,
若屬性存在,則直接賦值;
若不存在,則會調用__set函數。6。__toString()
打印一個對象的時被調用。如echo $obj;或print $obj;7。__clone()
克隆對象時被調用。如:$t=new Test();$t1=clone $t;8。__sleep()
serialize之前被調用。若對象比較大,想刪減一點東東再序列化,可考慮一下此函數。9。__wakeup()
unserialize時被調用,做些對象的初始化工作。10。__isset()
檢測一個對象的屬性是否存在時被調用。如:isset($c-name)。11。__unset()
unset一個對象的屬性時被調用。如:unset($c-name)。12。__set_state()
調用var_export時,被調用。用__set_state的返回值做為var_export的返回值。13。__autoload()
實例化一個對象時,如果對應的類不存在,則該方法被調用。魔術常量1。__LINE__
返迴文件中的當前行號。2。__FILE__
返迴文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個絕對路徑,而在此之前的版本有時會包含一個相對路徑。3。__FUNCTION__
返回函數名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。4。__CLASS__
返回類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。5。__METHOD__
返回類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
(1)初識魔術方法
Php5.0發布以來為我們提供了很多面向對象的特性,尤其是為我們提供了好多易用的魔術方法,這些魔術方法可以讓我們簡化我們的編碼,更好的設計我們的系統。今天我們就來認識下php5.0給我們提供的魔術方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/219525.html