導航:首頁 > 編程語言 > php堆和棧

php堆和棧

發布時間:2023-05-05 06:33:59

㈠ 大型系統上php令人不爽的九大原因


我在過去的四年裡一直致力於PHP應用的開發。PHP確實十分容易編寫。但是PHP也有一些十分嚴重的缺陷。
下面我會給出我的理由,為什麼PHP不適合於螞氏比小型業余網站更大的網站。
1. 對遞歸的不良支持
遞歸是一種函數調用自身的機制。這是一種強大的特性可以把某些復雜的東西變得很簡單。有一個使用遞歸的例子是快速排序(quicksort)。不幸的是,PHP並不擅長遞歸。Zeev,一個PHP開發人員,說道:「PHP 4.0(Zend)對密集數據使用了棧方式,而不是使用堆方式。也就是說它能容忍的遞歸函數的數量限制和其他語言比起來明顯少。」見bug 1901。這是一個很不好的借口。每一個編程語言都應該提供良好的遞歸支持。
2. 許多PHP模塊都不是線程安全的
在幾年前,Apache發布了Web伺服器的2.0版。這個版本支持多線程模式,在這個模式下,軟體一個一部分可以同時運行多個。PHP的發明者說PHP的核心是線程安全的,但是非核心模塊不一定是。但是十次有九次,你想要在PHP腳本中使用這種模塊,但這又使你的腳本不能合適Apache的多線程模式。這也是為什麼PHP小組不推薦在Apache 2 的多線程模式下運行PHP。不良的多線程模式支持使PHP常被認為是Apache 2依然不流行的原因之一。
請閱讀這篇討論: Slashdot: Sites Rejecting Apache 2?.
3. PHP 由於商業原因而不健全
通過使用緩存,PHP的性能可以陡增500%[見基準測試]。那麼為什麼緩存沒有被構建在PHP中呢?因為Zend——PHP的製造者,它在銷售自己的Zend Accelerator,所以當然,他們不想拋棄自己的商業產品這塊肥肉。
但是有另一個可選擇的: APC. (Zend後來推出Zend Optimizer,免費的加速器——譯者)
4. 沒有命名空間
設想某個人製作了一個PHP模塊用來閱讀文件。模塊中一個函數叫做read。然後另一個人的模塊可以讀取網頁的,同樣包含一個函數read。然後我們就無法同時使用這兩個模塊了,因為PHP不知道你要用哪個函數。但是有一個很簡單的解決方法,那就是命名空間。曾經有人建議PHP5加入這個特性,但不幸得是他沒有這么做。現在,沒有命名空間,每個函數都必須加上模塊名作為前綴,來避免名稱沖突。這導致了函數名恐怖得長,例如xsl_xsltprocessor_transform_to_XML讓代碼難於書寫和理解。
5. 不標準的日期格式字元
很多程序員對 日期格式字元都很熟悉,它是從UNIX和C語言中來的。其他一些編程語言採用了這個標准,但是很奇怪的,PHP有它自己的一套完全不兼容的日期格式字元。在C中,「% j」表示一年中的衡滲當天,在PHP中他表示一個月中的當天。然而使事情更混亂的是:Smarty (一個很流行的PHP模版引擎)的 strftime 函數和 date_format 函數,卻使用了C/UNIX的格式化字元。
6. 混亂的許可咐物脊證
你也許認為PHP是免費的,所有的在手冊中提到的PHP模塊也是免費的。錯了!例如,如果你想在PHP中生成PDF文件,你會在手冊中發現兩個模塊:PDF 和 ClibPDF。但是這兩個都是有商業許可證的。所以,你所使用的每個模塊,你都要確保你同意他的許可證。

㈡ php設計模式介紹之迭代器模式

《PHP設計模式介紹》第八章 迭代器模式

類中的面向對象編程封裝應用邏輯 類 就是實例化的對象 每個單獨的對象都有一個特定的身份和狀態 單獨的對象是一種組織代碼的有用方法 但通常你會處理一組對象或者集合

屬性來自 SQL 查陵空詢的一組數據就是一個集合 就像本書前面章節介紹的 Monopoly 游戲示例的對象列表

集合不一定是均一的 圖形用戶界面框架中的 Window 對象可以收集任意數量的控制對象 - Menu Slider 和 Button 並且 集合的實現可以有多種方式 PHP 數字是一個集合 但也是一個散列表 一個鏈接列表 一個堆棧以及隊列

問題

如何操縱任意的對象集合?

解決方案

使用迭代器模式來提供對集合內容的統一存取

你可能沒有意識到這一點 但你每天都在使汪拿用迭代器模式 - 它潛藏在 PHP 的數組類型和各種數組操作函數中 (其實 給你一些固有類的數組的組合和一群用這些固有類工作的可變函數 你將不得不使用這些數組來處理對象集合 這是在 PHP 中的本地數組迭代

$test = array( one o three );$output = ; reset($test); do {$output = current($test);} while (next($test));echo $output; // proces oneothree

reset() 函數將迭代重新轉到數組的開始 current() 返回當前元素的值 next() 則前進至數組中的下一個元素並返回新的 current() 值 當你超出數組的最後一個元素時 next() 返回 false 使用這些迭代方法 PHP 數組的內部實現就與你不相關了 迭代器結合了封裝和多態的面向對象程序設計原理 使用迭代器 你可以對集合中的對象進行操作 而無需專門了解集合如何顯現或者集合包含什麼(對象的種類) 迭代器提供了不同固定迭代實現的統一介面 它完全包含了如何操縱特定集合的詳細信息 包括顯示哪些項(過尺陵瞎濾)及其顯示順序(排序)

讓我們創建一個簡單的對象 在數組中對它進行操作 (盡管該示例在 PHP 環境下 但迭代器並不特定於 PHP 雖然添加了較多的引用操作符 本章節中的大多數示例在 PHP 下也能夠運行) 對象 Lendable 表示諸如電影 相冊等媒體 它作為 Web 站點的一部分或服務 允許用戶瀏覽或將他們的媒體集合分享給其他用戶 (對 於該示例 請無需考慮其他方面 )讓我們開始下面對 Lendable 基礎設計的測試

// PHP class LendableTestCase extends UnitTestCase {function TestCheckout() {$item = new Lendable;$this >assertFalse($item >borrower);$item >checkout( John );$this >assertEqual( borrowed $item >status);$this >assertEqual( John $item >borrower);}function TestCheckin() {$item = new Lendable;$item >checkout( John );$item >checkin();$this >assertEqual( library $item >status);$this >assertFalse($item >borrower);}}

要實現這一最初測試的需求 我們來創建一個帶有若干公共屬性和一些方法的類 來觸發這些屬性的值

class Lendable {public $status = library ;public $borrower = ;public function checkout($borrower) {$this >status = borrowed ;$this >borrower = $borrower;}public function checkin() {$this >status = library ;$this >borrower = ;}}

Lendable 是一個好的 普通的開端 讓我們將它擴展到諸如 DVD 或 CD 的磁軌項 媒體擴展了 Lendable 並且磁軌詳細記錄了特定媒體的詳細信息 包括項目的名稱 發布的年份以及項本身的類型

class Media extends Lendable {public $name; public $type; public $year;public function __construct($name $year $type= dvd ) {$this >name = $name;$this >type = $type;$this >year = (int)$year;}}

要使事情更加簡單 媒體有三個公共的實例變數 Media::name Media::year 和Media::type 構造函數採用了兩個參數 將第一個存儲在 $name 中 第二個存儲在 $year 中 構造函數還允許可選的第三個參數來指定類型(預設為dvd)

給定單獨的對象來操作 你現在可以創建一個容器來包含他們 Library 類似於常用的庫 Library 應該能夠添加 刪除和計算集合中的項 甚至 Library 還應該允許訪問集合(本章中的樣本代碼部分可看到示例)中的單一的項(對象)

我們開始構建 Library 的測試用例

class LibraryTestCase extends UnitTestCase {function TestCount() {$lib = new Library;$this >assertEqual( $lib >count());}}

它是滿足這一測試的簡單類

class Library {function count() {return ;}}

繼續將一些有趣的功能添加到測試中

class LibraryTestCase extends UnitTestCase {function TestCount() { /* */ }function TestAdd() {$lib = new Library;$lib >add( one );$this >assertEqual( $lib >count());}}

實現 add() 的簡單方法是建立在 PHP 靈活數組函數的基礎上 你可以將項添加到實例變數並使用 count() 來返回集合眾項的數量

class Library {protected $collection = array();function count() {return count($this >collection);}function add($item) {$this >collection[] = $item;}}

lishixin/Article/program/net/201311/13092

㈢ 如何獲取PHP變數的內存地址

不能獲取PHP變數的內存地址

  1. 「在一個頁面執行完後,依然調可以用這個地址」,這種需求本身就是無理的

  2. PHP(外文名:PHP: Hypertext Preprocessor,中文名:「超文本預處理器」)是一種通用開源腳本語言。語法吸收了C語言、java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨特的語法混合了C、Java、Perl以及PHP自創的語法。

  3. 它可以比CGI或者Perl更快速地執行動態網頁。

㈣ php全局變數在棧上嗎

和靜態變數都是保存在全局區的,普通變數保存在棧區,動態分配的內存空間是存在堆區的

㈤ php數組包含數字字元串嗎

本文小編為大家詳細介紹「php數組的元素可不可以是數字」,內容詳細,步驟清晰,細節處理妥當,希望這篇「php數組的元素可不可以是數字」文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

php數組的元素可以是數字。因為PHP是弱數據類型的編程語言,所以PHP中的數組可以存儲任櫻前高意多個、任意類型的數據,即數組元素的類型沒有限制,可以是數字(整數和浮點數)、字元串、布爾值、數組、Object對象等類型。



本教程操作環境:windows7系統、PHP8.1版、DELL G3電腦

php數組的元素可以是數字。

數組是 PHP 中最重要的數據類型之一,在 PHP 中的應用非常廣泛。因為 PHP 是弱數據類型的編程語言,所以 PHP 中的數組變數可以存儲任意多個、任意類型的數據,並且可以實現其他強數據類型中的堆、棧、隊列等數據結構的功能。

簡單來說,PHP數組元素的類型沒有限制,可以是數字、字元串、布爾值、數組、Object對象等類型。

示例1:索引數組

<?php
header("Content-type:text/html;charset=utf-8");
$arr= array(1,2,"3",4,0.5,"hello",TRUE,3.14);
var_mp($arr);
?>


說明:索引數組的下標(鍵名)由數字組成,默認從 0 開始,每個數字對應一個數組元素在數組中的位置,不需要特別指定,PHP 會自動為索引數組的鍵名賦一個整數值,然後從這個值開始自動遞增。

示例2:關聯數組

<?php
header("Content-type:text/html;charset=utf-8");
$arr=array(1=>1,"a"=>3.5,2=>2,"b"=>0,"c"=>"blue");
var_mp($arr);
?>


說明:關聯數組的下標(鍵名)由數值和字元串混合的形式組成,如果一個數組中有一個鍵名不是數字,那麼這個數組就是關聯數組。

php中的數字

在php中,數字可分為integer(整型)和float(浮點型)

類型 功能
integer(整型) 整型包含所有的整數,可以是正數也可以是負數
float(浮點型) 浮點型也是用來表示數字的,與整型不同除了可以表示整數外它還可以用來表示小數和指數
1)整型

在 PHP 中,整型變數稱為 integer 或 int 類型,用來表示一個整數,整型的規則如下所示:

整型必須至少有一個數字(0~9);

整型不能包含逗號或空格;

整型不能包含小數點;

整型可以是正數或負數。

整型的取值范圍必須介於 -2E31 到 2E31 之間,可以用三種格式來表示,即十進制、十六進制(以 0x 為前綴)和八進制(以 0 為前綴)。

<?php
$x = 5985; // 定義一個整型數據類型的變數
var_mp($x); // 輸出此變數
$x = -345;
var_mp($x);
$x = 0x8C; //十六進制數字
var_mp($x);
$x = 047; //八進制數字
var_mp($x);
?>


注意,在 PHP7 版本中,含有十六進制字元的字元串不再被視為數字,而是當作普通的字元串。

2)浮點型

浮點型在 PHP 中被稱為 float 類型,也可稱為實數,可以用來存儲悔鬧整數和小數,有效的取值范圍是 1.8E-308 到 1.8E+308 之間。浮點數的精確度比整型數據類型要高。

<?php
$num1 = 10.365;
$num2 = 2.4e3;
$num3 = 8E-5;
var_mp($num1, $num2, $num3);
?>


讀到這里,這篇「php數組的元素可不可以是數字」文章已經介紹完畢,想要掌握這篇文章的知脊尺識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速雲行業資訊頻道。

㈥ PHP zend Studio 出現棧堆溢出問題,求大神解決

http://bbs.csdn.net/topics/340055042

先退出zend,虛廳碰再將差談這個zde文件夾刪除,再重伏蘆啟zend看看

㈦ 技術棧是什麼

技術棧是IT行業里的一種術語,是某項工作或某個職位需要掌握的一系列技能組合的統稱。

一般來說是指將N種技術互相組合在一起(N>1),作為一個有機的整體來實現某種目的或功能。也可以指掌握這些技術以及配合使用的經驗。例如,一個基本的web應用程序可能包括一系列技術,如操作系統、銷罩web伺服器、資料庫和編程語言。

更復雜的應用程序可能涉及額外的層,如緩存伺服器、負載平衡器和前端框架。堆棧中使用的具體技術將根據項目的需要而有所不同。然而,一些常見的例子包括Linux、Apache、MySQL和PHP(稱為「LAMP」棧)。最終,技術堆棧的目標是提供構建和運行成功應用程吵顫序所需的所有組件。

技術棧目錄結構

技術棧目錄包含以下子文件夾:

conf/:存放技術棧配置文件。為可選文件,內容可以為空。

lifecycle/:存放生命周期代碼。理論上您可以使用任何語言來編寫這些生命周期腳本。lifecycle目錄下所有文件名必須以專屬前綴ac_開頭,且沒有後綴。目前,下述文件的命名為固定命名:

ac_setup:技術棧依賴的安裝腳升斗敗本,主要代碼邏輯為讀取resources目錄下的文件,解壓、安裝、配置環境變數等。

ac_init_env:可選。用於部署前的相關任務處理。

ac_deploy:應用程序包的啟動腳本。核心啟動命令為:java-jarappname.jar

ac_check_service:可選。檢測應用是否啟動。

ac_shutdown:停止應用。

㈧ 簡評用PHP開發大型系統的缺點

筆者在過去的四年裡一直致力於PHP應用的開發 PHP確實十分容易編寫 但是PHP也有一些十分嚴重的缺陷

下面筆者會給出自己的理由 為什麼PHP不適合於比小型業余網站更大的網站

對遞歸的不良支持

遞歸是一種函數調用自身的機制 這是一種強大的特性可以把某些復雜的東西變得很簡單 有一個使用遞歸的例子是快速排序(quicksort) 不幸的是 PHP並不擅長遞歸 Zeev 一個PHP開發人員 說道 PHP (Zend)對密集數據使用了棧方式 而不是使用堆方式 也就是說它能容忍的遞歸函數的數量限制和其他語言比起來明顯少 見bug 這是一個很不好的借口 每一個編程語言都應該提供良好的遞歸支持

許多PHP模塊都不是線程安全的

在幾年前 Apache發布了Web伺服器的 版 這個版本支持多線程模式 在這個模式下 軟體一個一部分可以同時運行多個 PHP的發明者說PHP的核心是線程安全的 但是非核心模塊不一定是 但是十次有九次 你想要在PHP腳本中使用這種模塊 但這又使你的腳本不能合適Apache的多線程模式 這也是為什麼PHP小組不推薦在Apache 的多線程模式下運行PHP 不良的多線程模式支持使PHP常被認為是Apache 依然不流行的原因之一

PHP 由於商業原因而不健全

通過使用緩存 PHP的性能可以陡增 %[見基準測試] 那麼為什麼緩存沒有被構建在PHP中呢?因為Zend——PHP的製造者 它在銷售自己的Zend Accelerator 所以當然 他們不想拋棄自己的商業產品這塊肥肉

但是有另一個可選擇的 APC (Zend後來推出Zend Optimizer 免費的加速器——譯者)

沒有命名空間

設想某個人製作了一個PHP模塊用來閱讀文件 模塊中一個函數叫做read 然後另一個人的模塊可以讀取網頁的 同樣包含一個函數read 然後我們就無法同時使用這兩個模塊了 因為PHP不知道你要用哪個函數

但是有一個很簡單的解決方法 那就是命名空間 曾經有人建議PHP 加入這個特性 但不幸得是他沒有這么做 現在 沒有命名空間 每個函數都必須加上模塊名作為前綴 來避免名稱沖突 這導致了函數名恐怖得長 例如xsl_xsltprocessor_transform_to_xml讓代碼難於書寫和理解

不標準的日期格式字元

很多敏敏程序員對 日期格式字元 都很熟悉 它是從UNIX和氏握C語言中來的 其他一些編程語言採用了這個標准 但是很奇怪的 PHP有它自己的一套完全不兼容的日期格式字元 在C中 %j 表示一年中的當天 在PHP中他表示一個月中的當天 然而使事情更混亂的是 Smarty (一個很流行的PHP模版引擎)的 strftime 函數和 date_format 函數 卻使用了C/UNIX的格式化字元

混亂的許可證

你也許認為PHP是免費的 所有的在手冊中提到的PHP模塊也是免費的 錯了!例如 如果你想在PHP中生成PDF文件 你會在手冊中發現兩個模塊 PDF 和 ClibPDF 但是這兩個都是有商業許可證的 所以 你所使用的每個模塊 你都要確保你同意他的許可證

不一致的函數命名規則

有些函數名稱是有多個單片語成的 一般有三種單詞殲拿慶組合的習慣

直接拼接 getnumberoffiles 用下劃線分開 get_number_of_files 駱駝法則 getNumberOfFiles 大部分語言選擇其中一中 但是PHP都用到了

例如 你想要把一些特殊字元轉換成HTML實體 你會使用函數entities (直接拼接單詞) 如果你要使用相反的功能 你要用到它的小弟弟_entity_decode 由於某些特殊的原因 這個函數名是由下劃線分隔單詞 怎麼能這樣呢?你知道有一個函數叫strpad 或者他是str_pad?每次你都要查看一下到底這個符號是什麼或者直接等他出現一個錯誤 函數是不分大小寫的 所以對於PHP來說rawurldecode 和RawUrlDecode之間沒有什麼區別 這也很糟糕 因為兩個都使用到了同時他們看上去還不一樣 混淆了閱讀者

魔法引用的地獄

魔法引用(Magic quote)可以保護PHP腳本免受SQL注入攻擊 這很好 但是出於某些原因 你可以在php ini中關閉這個配置 所以你如果要寫出一個有彈性的腳本 你總要檢查魔法引用是開啟還是關閉 這樣一個 特性 應該讓編程更簡單 而事實上變得更復雜了

缺少標准框架

一個成長中的網站沒有一個整體框架 最終會變成維護的噩夢 一個框架可以讓很多工作變得簡單 現在最流行的框架模型時MVC 模型 在其中表現層 業務邏輯和資料庫訪問都分離開了

很多PHP網站不使用MVC 模型 他們甚至沒有一個框架 甚至現在有一些PHP框架同時你都可以自己寫一個 關於PHP的文章和手冊沒有提高框架的一個字 同時JSP 開發人員使用像Struts的框架 ASP開發人員使用 Net 看起來好像這些概念都廣泛被PHP開發人員所了解 這就說明了PHP實際上到底是多專業

總結

什麼問題?

對於非常小的項目 它可以是一個十分符合人意的編程語言 但是對於較大的和更為復雜的項目 PHP就顯出他的薄弱了 當你不斷地摸索之後 你會發現筆者提到的某些問題的解決方案 所以 當解決方案已知之後 為什麼不能修正他呢?另外為什麼這些修補不在手冊中提到呢?

一個開源的語言十分流行是一件好事 但不幸得是 它不是一個偉大的語言 筆者希望所有的問題能有一天得到解決(也許在PHP ?) 然後我們就將擁有一個開源語言 他既開源 又好用

lishixin/Article/program/PHP/201311/21478

㈨ php中的靜態變數和動態變數的區別

動態變數和靜態變數的區別:
1、存儲位置
動態變數:存儲在內存出棧數據區
靜態變數:存儲在全局數據區模團(靜態數據區)
2、生命期
動態變數:根據你定義的位置確定,比如你在一個函數中定義的,那麼超出該函數范圍變數將失效
靜態變數:程序結束時才釋放
3、作用域
動態變數:同樣的要根據你定義的位置才能確定,和第二點的一樣
靜悶碼局態變數:當前文件中有效
堆和棧的區分:
堆(Heap)棧(Stack)
1、內存分配方面:
堆:一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式是類似於鏈表。可能用到的關鍵字如下:new、malloc、delete、free等等。
棧:由編譯器(Compiler)自動分配釋放,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧。
2、申請方式方面:
堆:需要程序員自己申請,並指明大小。在c中malloc函數如p1 = (char *)malloc(10);在C++中用new運算符,但是注意p1、p2本身是在棧中的。因為他們還是可以認為是局部變數。
棧:由系統自動分配。 例如,聲明在函數中一個局部變數 int b;系統自動在螞讓棧中為b開辟空間。
3、系統響應方面:
堆:操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閑結點鏈表中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣代碼中的delete語句才能正確的釋放本內存空間。另外由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閑鏈表中。
棧:只要棧的剩餘空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。
4、大小限制方面:
堆:是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間

㈩ php能不能像java那樣列印錯誤堆棧信息到錯誤日誌

PHP 確實不會輸出錯誤堆棧,但通過函數,還是能夠獲取到錯誤堆棧的。
function getBacktrace() {
ob_start();
debug_print_backtrace();
return ob_get_clean();
}

調用上面這個函數取得錯誤堆棧,再用 file_put_contents('log_path', FILE_APPEND); 寫入日誌文件即可。
還有一個辦法:為 PHP 安裝 xdebug 擴展
windows 下的安裝方法 安裝好後,修改 php.ini

閱讀全文

與php堆和棧相關的資料

熱點內容
微信聊天界面源碼 瀏覽:22
seo競價推廣點擊價格演算法公式 瀏覽:315
框架結構可以加密嗎 瀏覽:218
python編譯器怎麼清除 瀏覽:73
linux全局socks代理 瀏覽:611
php微信抽獎 瀏覽:771
壓縮演算法嵌入式移植 瀏覽:531
php新手小例子 瀏覽:233
按照醫生的演算法一周是幾天 瀏覽:805
三次b樣條曲線演算法 瀏覽:924
java7特性 瀏覽:555
愛山東app小學報名怎麼知道報沒報上 瀏覽:458
android獲取wifi信號 瀏覽:133
娜拉美妝app怎麼使用 瀏覽:760
有了源碼要買伺服器嗎 瀏覽:365
app怎麼查看自己的存款利息 瀏覽:515
碧藍安卓與b站有什麼區別 瀏覽:342
php靜態塊 瀏覽:719
ftpmget命令 瀏覽:475
源碼時代怎樣 瀏覽:415