php版本哪個沒有面向對象,php面向對象的方法重載兩種版本比較

多個函數用同一個名字,但參數表,即參數的個數或(和)數據類型可以不同,調用的時候,雖然方法名字相同,但根據參數表可以自動調用對應的函數。

PHP4 中僅僅實現了面向對象的部分的、簡單的功能,而 PHP5 以后對對象的支持就強大的多了。

對于多態的實現,PHP4 只支持覆蓋(override),而不支持重載(overload)。但我們可以通過一些技巧來“模擬”重載的實現。

PHP5 雖然可以支持覆蓋和重載,但重載在具體實現上,和其他語言還有較大的差別。

1,在 PHP4 中“模擬”重載

試看以下代碼:

//根據參數個數選擇執行不同的方法(在 PHP4 中模擬"重載"(多態的一種)

class Myclass

{

function Myclass()

{

$method = "method" . func_num_args();

$this->$method();

}

function method1($x)

{

echo "method1";

}

function method2($x, $y)

{

echo 'method2';

}

}

//通過在類中的額外的處理,使用這個類對用戶是透明的:

$obj1 = new Myclass('A'); //將調用 method1

$obj2 = new Myclass('B','C'); //將調用 method2

?>

以上代碼中,通過在構造函數中使用 func_num_args() 函數取到參數的個數,自動執行 method1 或 method2 方法。我們可以結合函數 func_get_arg(i) 和 func_get_args() 對以上示例進行改進。

2,在 PHP5 中使用重載

先看以下示例:

class Myclass

{

public $attriable;

public $one = "this is one";

public $two = "this is two";

function __construct()

{

}

function one($one)

{

$this->one=$one;

$this->attriable = $this->one;

}

function one($one, $two)

{

$this->one=$one;

$this->two=$two;

$this->attriable = $this->one . $this->two;

}

function display()

{

echo $this->attriable;

}

}

$one = "this is my class";

$two = "Im the best";

$myclass = new myclass();

$myclass->one($one);

$myclass->display();

$myclass->one($one, $two);

$myclass->display();

//本例的做法,在 PHP 中是不正確的!

?>

使用過 C++、Java、C# 重載的人,很習慣地就會寫出以上的重載實現的 PHP 代碼。但這在 PHP5 中是不正確的。PHP5 并不是對前述幾種語言的模仿,而是有自己的一套實現方法重載的方法(是好是壞,這里不討論)。 雖說 PHP5 的類較 PHP4 強大了許多,但是在“重載”這個問題上并沒有像我們預期的那樣“改善”。在“強”類型的語言中可以通過不同的參數類型來實現“重載”,比如C++、Java、C# 等。在“固定參數”傳遞的語言中,還可以通過參數的個數進行傳遞,比如 Java,但是 PHP 是弱類型語言,因此不會出現類似以上的“重載”。

PHP5 中重載可以通過 __get, __set, and __call 幾個特殊方法來進行。當 Zend 引擎試圖訪問一個成員并沒有找到時,PHP將會調用這些方法。

在以下示例中,__get和__set代替所有對屬性變量數組的訪問。如果必要,你還可以實現任何類型你想要的過濾。例如,腳本可以禁止設置屬性值, 在開始時用一定的前綴或包含一定類型的值。__call 方法說明了你如何調用未經定義的方法。你調用未定義方法時,方法名和方法接收的參數將會傳給__call方法, PHP傳遞__call的值返回給未定義的方法。

class Overloader

{

private $properties = array();

function __get($property_name)

{

if(isset($this->properties[$property_name]))

{

return($this->properties[$property_name]);

}

else

{

return(NULL);

}

}

function __set($property_name, $value)

{

$this->properties[$property_name] = $value;

}

public function __call($method, $p)

{

print("Invoking $method()
n");

//print("Arguments: ");

//print_r($args);

if($method == 'display')

{

if(is_object($p[0]))

$this->displayObject($p[0]);

else

if(is_array($p[0]))

$this->displayArray($p[0]);

else

$this->displayScalar($p[0]);

}

}

public function displayObject($p)

{

echo ("你傳入的是個對象,內容如下:
");

print_r($p);

echo "


";

}

public function displayArray($p)

{

echo ("你傳入的是個數組,內容如下:
");

print_r($p);

echo "


";

}

public function displayScalar($p)

{

echo ("你傳入的是個單獨變量,內容如下:
" . $p);

echo "


";

}

}

$o = new Overloader();

//調用 __set() 給一個不存在的屬性變量賦值

$o->dynaProp = "Dynamic Content";

//調用 __get()

print($o->dynaProp . "
n");

//調用 __call()

//$o->dynaMethod("Leon", "Zeev");

$o->display(array(1,2,3));

$o->display('Cat');

?>

以上代碼中,調用了 display() 方法,可以根據參數的類型和個數調用類中的對應的代碼段,從而實現了對象方法的重載。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533574.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533574.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533574.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python實現錄音小程序 界面_小程序如何實現錄音 播放功能

第二步:編輯文件首先在src下創建一個test包并在test包下新建一個類MyRecord具體步驟代碼如下所示:package test;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.io.*;import javax.sound.sampled.*;public class MyRecord…

織夢php網站修改教程,織夢DEDEcms織夢軟件模型增加圖集功能教程(含修改文件下載)...

這篇文章主要為大家詳細介紹了織夢DEDEcms織夢軟件模型增加圖集功能教程(含修改文件下載),具有一定的參考價值,感興趣的小伙伴們可以參考一下,有需要的朋友可以收藏方便以后借鑒。織夢DEDEcms織夢軟件模型增加圖集功能,這是今天361模板要給大家分享的。下…

python自動截圖發送郵件_PhantomJS按尺寸截取頁面,并用python發送郵件

前言:當前有個任務是要把幾個網站的日志返回狀態碼進行匯總,用餅圖展示,并每天發送郵件。一、分析問題畫出餅圖,這個我用kibana給畫出來了,下面不做講解;截取餅圖,因為kibana是用js展示出來的&a…

nikita popov php,PHP中對performance的考慮點

Nikita Popov 在他的演講中談了幾個PHP 程序中和performance相關的point。1.PHP使用shared memory, preload的方式事先分配,而只有在所有的處理結束之后,share memory 才會斷開和所有進程或者thread之間的聯系。光是opcode,FPM的設定還不足以…

python建模仿真 matlab_清華大學出版社-圖書詳情-《仿真建模與MATLAB實用教程》

MATLAB語言是目前世界上最為流行的科學計算語言之一,它的特點是能夠快速地完成諸如矩陣運算、微分、尋優等計算任務。由于它配備了很多應用領域的專業工具箱,諸如金融、信號處理、圖像處理、神經網絡、嵌入式系統、仿真建模等,而且每個工具箱都包含了該應…

java web使用jquery,JAVA_Web_JQuery

簡介:jquery 全稱 javaScript Query.是js的一個框架。本質上仍然是js。特點:支持各種主流的瀏覽器、使用特別簡單、擁有便捷的插件擴展機制和豐富的插件。一、JQuery內部封裝原理介紹:匿名閉包。下面這兩行代碼是jquery包下的已經封裝的代碼&…

python語法學習_Python學習1——語法

Python語法包括了行、縮進、注釋、標識符、保留關鍵字等方面。打印語句:>>> print(hello,world!)hello,world!輸入語句:>>> input(請輸入你的名字:)請輸入你的名字:哈哈#”哈哈”是你自己輸入的名字哈哈 #打印出…

java 兩個頁面傳遞數據,請問Cookie怎么在兩個頁面間傳遞數據?

參考代碼如下://如果請求的Cookie對象為空if (Request.Cookies["userCookie"] null){//創建一個Cookie對象HttpCookie userCookie new HttpCookie("userCookie");//給對象賦值userCookie.Values["userName"] userInfo.UserName.ToS…

優化matlab作業,現代設計優化算法MATLAB實現

開篇語前陣子做現代設計方法的時候,發現網上很是缺乏這種作業形式的簡易算法實現,所以特地來簡書寫一篇。有兩份,一份是我的(說來慚愧,我的大部分都是在網上找的代碼,然后在自己的電腦上跑一次,跑出來了就行…

怎樣用python畫玫瑰花的簡筆畫_玫瑰花簡筆畫素描作品圖片

玫瑰原產是中國。在古時的漢語,“玫瑰”一詞原意是指紅色美玉。玫瑰花這么漂亮,素描怎么畫得好看呢?你知道玫瑰花的簡筆畫素描是怎樣的嗎?今天先和學習啦小編一起欣賞這些玫瑰花簡筆畫素描圖片,希望你會有所收獲的。玫瑰花簡筆畫素描圖片欣…

多因子選選股MATLAB代碼,金工研報:利用卷積神經網絡進行多因子選股

首先,我們先來看一下通過卷積神經網絡選股模型的整體流程,然后再根據每一步流程進行介紹,具體如下圖所示:1、數據獲取用于歷史回測數據來自所有A股股票,其中剔除了ST股以及上市3個月的股票,另外&#xff0c…

python list tuple 打包 解包_python的打包與解包

python的*與**,在函數的定義與調用過程中,有著不同的作用打包參數:一、函數定義時,形參前加*號(如:*args):收集實參中所有的位置參數,打包成新元組并將該元組賦值給args變量實參位置參數&#x…

python 成員函數 泛型函數_【一點資訊】白學這么多年 Python?連泛型函數都不會寫? www.yidianzixun.com...

泛型,如果你嘗過java,應該對他不陌生吧。但你可能不知道在 Python 中(3.4 ),也可以實現 簡單的泛型函數。在Python中只能實現基于單個(第一個)參數的數據類型來選擇具體的實現方式,官方名稱 是single-dispatch。你或許聽不懂&…

matlab bad apple,【bad apple】matlab制作矩陣蘋果~

有屏幕的地方就有bad apple那么作為一名工科生,熟練的操♂作馬桶蘿卜(matlab)是一項基本技能下面開始講解如何用matlab制作別具一格的“矩陣蘋果”~實驗環境matlab R2018a原版bad apple視頻技術要求可以即時演算圖形可以將處理后的每幀圖形合并成新的視頻先上代碼%t…

服務器ip直接訪問php怎么寫,php - 如何實現用公網ip訪問到服務器上的網頁?

服務器系統是Windows Server 2012 R2,已經部署了IIS、PHP和MySQL,能夠在云服務器上通過localhost打開php網頁,(放在服務器wwwroot上的index.php)已在ISS管理器中添加網站,但編輯網站綁定時,在ip地址中填入了服務器的公…

vb6 打印選項對話框_圖紙打印次數太多,不知道哪次才是最新的?用打印戳記區分效果好...

原創:就說我在開發區使用AutoCAD從事設計工作的朋友們不知道有沒遇到過這種情況:圖紙在反復修改打印的過程中,由于圖紙內容高度相似,往往搞不清究竟哪個才是最新版本的圖紙了。這種情況下,細致入微地去核對非常麻煩&am…

安卓文本編輯器php cpp,用安卓原生控件封裝一個簡易的富文本編輯器

最近接到項目需求:移動端原生寫一個富文本編輯器。 ( ⊙ o ⊙ )從沒遇到過富文本要用原生寫的,然后就查閱各種資料。然后結合自己的思路:其實安卓的富文本編輯器就是一個 “容器”。那么接下來我就帶給大家說一說我自定義這個富文本編…

python和nltk自然語言處理書評_Python和NLTK自然語言處理

模塊1 NLTK基礎知識第 1章 自然語言處理簡介 31.1 為什么要學習NLP 41.2 從Python的基本知識開始 71.2.1 列表 71.2.2 自助 81.2.3 正則表達式 91.2.4 詞典 111.2.5 編寫函數 111.3 NLTK 131.4 試一試 181.5 本章小結 18第 2章 文本的整理和清洗 192.…

vue tab切換_iviewUITabs選項卡切換組件

概述 選項卡切換組件,常用于平級區域大塊內容的的收納和展現。源碼地址:https://github.com/iview/iview/tree/2.0/src/components/tabs使用: 標簽一的內容標簽二的內容標簽三的內容標簽二的內容在源碼的tabs文件下有三個文件:ind…

java biginteger 比較大小,java – 打印非常大的BigIntegers

我試圖找出與Java 7 x64中的BigIntegers相關的以下問題.我試圖計算一個極高功率的數字.代碼如下,然后是問題描述.import java.math.BigInteger;public class main {public static void main(String[] args) {// Demo calculation; Desired calculation: BigInteger("4096&…