phpclone對象克隆,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-tw/n/219525.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-09 10:59
下一篇 2024-12-09 10:59

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 面向對象編程、類和對象

    面向對象編程(Object-Oriented Programming, OOP)是一種編程方法,它將現實世界中的事物抽象為對象(Object),對象的屬性和方法被封裝成類(Clas…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • Mapster:一個高性能的對象映射庫

    本文將深入介紹furion.extras.objectmapper.mapster,一個高性能的對象映射庫,解釋它是如何工作的以及如何在你的項目中使用它。 一、輕鬆地實現對象之間的…

    編程 2025-04-28
  • Python返回對象類型

    Python是一種動態、解釋型、高級編程語言。Python是一種面向對象的語言,即所有的一切都是一個對象。 一、基本類型 Python中的基本類型有整數int、浮點數float、布…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若伺服器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • Python中通過對象不能調用類方法和靜態方法的解析

    當我們在使用Python編寫程序時,可能會遇到通過對象調用類方法和靜態方法失敗的問題,那麼這是為什麼呢?接下來,我們將從多個方面對這個問題進行詳細解析。 一、類方法和靜態方法的定義…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • Python內置函數——查看對象內存

    本文將介紹Python內置函數中,在開發中查看對象內存的相關函數。 一、id()函數 id()函數是Python內置函數,用於返回對象的唯一標識符,也就是對象在內存中的地址。 nu…

    編程 2025-04-27

發表回復

登錄後才能評論