【高手請近】PHP 【global引用傳遞】 和 【static 靜態變數】 不起作用

來源:互聯網
上載者:User
兩個單獨的PHP檔案: PhpGlobal.php 和 PhpStatic.php

PhpGlobal.php全部內容:
>>Parse error: syntax error, unexpected '&', expecting T_VARIABLE or '$' in D:\WebSite\MyHost\www.35dalu.com\public_html\test\PhpGlobal.PHP on line 10*/function censorCount(&$string){  global &$censorCount;  $censorCount = (object)array('banned' => 0,'mod'=> 0,'filter' => 0);  if(preg_match("/日本/i",$string))  {    $censorCount->banned++;  }  if(preg_match("/韓國/i",$string))  {    $censorCount->mod++;  }  if(preg_match("/尼瑪/i",$string))  {    $censorCount->filter++;    $string = str_replace("尼瑪","nima",$string);  }  return $string;}$arr = array('title'     => "尼瑪韓國比日本牛鼻嗎?",'content'   => "韓國比日本牛鼻嗎?WHOSAIDSO?WHO !WHO!",'author'    => "韓國比",);$censorCount = '';foreach( $arr as $k => $v){  $arr[$k] = censorCount( $v );}print_r( $arr );echo '';print_r( $censorCount );





PhpStatic.php全部內容:
>>Array(    [title] => **nima**韓國比日本牛鼻嗎?    [content] => 韓國比日本牛鼻嗎?WHOSAIDSO?WHO !WHO!    [author] => 韓國比)0*/function censorCount(&$string){  static $censorCount;  static $cc = 0;  $censorCount = (object)array('banned' => 0,'mod'=> 0,'filter' => 0);  if(preg_match("/日本/i",$string))  {    $cc++;    $censorCount->banned++;  }  if(preg_match("/韓國/i",$string))  {    $cc++;    $censorCount->mod++;  }  if(preg_match("/尼瑪/i",$string))  {    $cc++;    $censorCount->filter++;    $string = str_replace("尼瑪","**nima**",$string);  }  return $string;}$cc=0;$arr = array('title'     => "尼瑪韓國比日本牛鼻嗎?",'content'   => "韓國比日本牛鼻嗎?WHOSAIDSO?WHO !WHO!",'author'    => "韓國比",);$censorCount = '';foreach( $arr as $k => $v){  $arr[$k] = censorCount( $v );}print_r( $arr );echo '';echo "$cc";print_r( $censorCount );


我現在要的內容是:每次檢測都會讓檢測的結果累加。
在弄一個字串過濾的函數但是裡面的檢測結果不能統計,就是程式全部檢測完之後統計一遍 所有總的 mod數目 banned數目 filter數目。但是 static 靜態變數 和 global 引入傳遞都不起作用!


回複討論(解決方案)

沒仔細看代碼,不過你可以考慮寫到一個檔案裡面,或者用資料庫儲存

$censorCount = (object)array('banned' => 0,'mod'=> 0,'filter' => 0);


賦值,,,會抹去之前所有的改動

你這代碼即使實現看起來也夠難看,用類方式重寫吧。

function censorCount(&$string=''){  static $censorCount;  static $cc = 0;  if(empty($string)) return $censorCount;//注意這裡  if(empty($censorCount)) $censorCount = (object)array('banned' => 0,'mod'=> 0,'filter' => 0);//注意這裡  if(preg_match("/日本/i",$string))  {    $cc++;    $censorCount->banned++;  }  if(preg_match("/韓國/i",$string))  {    $cc++;    $censorCount->mod++;  }  if(preg_match("/尼瑪/i",$string))  {    $cc++;    $censorCount->filter++;    $string = str_replace("尼瑪","**nima**",$string);  }  return $string;}$cc=0;$arr = array('title'     => "尼瑪韓國比日本牛鼻嗎?",'content'   => "韓國比日本牛鼻嗎?WHOSAIDSO?WHO !WHO!",'author'    => "韓國比",);$censorCount = '';foreach( $arr as $k => $v){  $arr[$k] = censorCount( $v );}print_r( $arr );echo '';echo "$cc";print_r( censorCount() );//注意這裡
另一版本與此類似

PHP code
function censorCount(&$string='')
{
static $censorCount;
static $cc = 0;
if(empty($string)) return $censorCount;//注意這裡
if(empty($censorCount)) $censorCount = (object)array('bann……

謝謝啊。
不過那個 $cc的變數的值沒有變啊。
另外我有一個疑問的地方。
(1)如果在函數裡面使用static,那麼那個變數不需要提前聲明嗎?
(2)我發現有的時候 $obj=(object)array(); 會報錯,必須寫非空的array()才不會。但是有的時候我又發現直接寫一句 $obj=(object)array(); 不會報錯,但是有的時候又會報錯。
(3)關於函數內引用傳遞的 在函數內使用 global &$var; 立即報錯。那個 & 和 $var 之間是否要空格?還是 & 和$var串連在一起。
(4)函數引用傳遞的問題。只知道變數引用傳遞是在函數內變動,那麼函數外的也變了。那函數引用傳遞是什麼作用?一直難以理解…………

$obj=(object)array(); 有時候會報錯?我見暫時毛見過,當然我也用得不多
&$var 不需要空格
函數引用返回多見於對象吧,比如引用一個物件變數很多,你希望用完後人肉清理,可以用&.再$test=null

老兄也有這個問題啊! 仔細看手冊,一句一句地看及例子了。

你的代碼太長了。


(1)如果在函數裡面使用static,那麼那個變數不需要提前聲明嗎?

static就是聲明,也可賦值。只起作用一次。

(2)我發現有的時候 $obj=(object)array(); 會報錯,必須寫非空的array()才不會。但是有的時候我又發現直接寫一句 $obj=(object)array(); 不會報錯,但是有的時候又會報錯。

如果$obj已是引用,或能會報錯。正常情況,不報錯。 這一點自已測試看看吧! 看手冊的例子了。

(3)關於函數內引用傳遞的 在函數內使用global &$var; 立即報錯。那個 & 和 $var 之間是否要空格?還是 & 和$var串連在一起。

global本身就是引用,不需要& .

(4)函數引用傳遞的問題。只知道變數引用傳遞是在函數內變動,那麼函數外的也變了。那函數引用傳遞是什麼作用?一直難以理解…………

如果變數沒有聲明,自動建立。 作用很簡單啊,正常情況下,變數在函數內是局變的。 引用可以直接操作全域的變數。

以前特點是對象引用很有意義。 但php5之 ,所有對象都是本身就是引用方式傳參的。用不用都行了。 只有變數引用才有意義。

這在設計模式時很有意義,你可以方便地將對象傳給任何其他對象。 引用來引用去!

先結貼了。對於 function 的引用傳遞不是很理解。~

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.