国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP析構方法 __destruct() 不觸發的兩個解決辦法

2024-05-04 21:51:01
字體:
來源:轉載
供稿:網友

本篇文章主要給大家介紹PHP 析構方法 __destruct() 不觸發的兩個解決辦法。

有時候在 PHP 里類循環引用時,會導致 __destruct() 不觸發的問題,先上問題代碼:

  1. <?php 
  2.  
  3. class Proxy 
  4.  
  5.  
  6.     private $object
  7.  
  8.    
  9.  
  10.     public function __construct($object
  11.  
  12.     { 
  13.  
  14.         $this->object = $object
  15.  
  16.     } 
  17.  
  18.    
  19.  
  20.     public function __destruct() 
  21.  
  22.     { 
  23.  
  24.         var_dump('__destruct:Proxy'); 
  25.  
  26.     } 
  27.  
  28.  
  29.    
  30.  
  31. class Test 
  32.  
  33.  
  34.     private $proxy
  35.  
  36.    
  37.  
  38.     public function __construct() 
  39.  
  40.     { 
  41.  
  42.         $this->proxy = new Proxy($this); 
  43.  
  44.     } 
  45.  
  46.    
  47.  
  48.     public function __destruct() 
  49.  
  50.     { 
  51.  
  52.         var_dump('__destruct:Test'); 
  53.  
  54.     } 
  55.  
  56.  
  57.    
  58.  
  59. $test = new Test; 
  60.  
  61. unset($test); 
  62.  
  63.    
  64.  
  65. echo 'no __destruct, wait 3s', PHP_EOL; 
  66.  
  67.    
  68.  
  69. sleep(3); 
  70.  
  71.    
  72.  
  73. echo '__destruct now:', PHP_EOL; 

如上代碼,運行unset($test)時,不會觸發__destruct(),因為有了循環引用。

再看下面的解決方法1的代碼:

  1. <?php 
  2.  
  3. class Proxy 
  4.  
  5.  
  6.     private $object
  7.  
  8.    
  9.  
  10.     public function __construct($object
  11.  
  12.     { 
  13.  
  14.         $this->object = $object
  15.  
  16.     } 
  17.  
  18.    
  19.  
  20.     public function __destruct() 
  21.  
  22.     { 
  23.  
  24.         var_dump('__destruct:Proxy'); 
  25.  
  26.     } 
  27.  
  28.  
  29.    
  30.  
  31. class Test 
  32.  
  33.  
  34.     private $proxy
  35.  
  36.    
  37.  
  38.     public function __construct() 
  39.  
  40.     { 
  41.  
  42.         $this->proxy = new Proxy($this); 
  43.  
  44.     } 
  45.  
  46.    
  47.  
  48.     public function __destruct() 
  49.  
  50.     { 
  51.  
  52.         var_dump('__destruct:Test'); 
  53.  
  54.     } 
  55.  
  56.    
  57.  
  58.     public function close() 
  59.  
  60.     { 
  61.  
  62.         $this->proxy = null; 
  63.  
  64.     } 
  65.  
  66.  
  67.    
  68.  
  69. $test = new Test; 
  70.  
  71. $test->close(); 
  72.  
  73.    
  74.  
  75. echo '__destruct now:', PHP_EOL; 
  76.  
  77.    
  78.  
  79. unset($test); 
  80.  
  81.    
  82.  
  83. sleep(3); 
  84.  
  85.    
  86.  
  87. echo 'no operation', PHP_EOL; 

上面的代碼,在unset之前,將Test類中的proxy設為null,然后再unset,就可以觸發__destruct()了。

當然,你也可以手動gc(解決方法2):

  1. <?php 
  2.  
  3. class Proxy 
  4.  
  5.  
  6.     private $object
  7.  
  8.    
  9.  
  10.     public function __construct($object
  11.  
  12.     { 
  13.  
  14.         $this->object = $object
  15.  
  16.     } 
  17.  
  18.    
  19.  
  20.     public function __destruct() 
  21.  
  22.     { 
  23.  
  24.         var_dump('__destruct:Proxy'); 
  25.  
  26.     } 
  27.  
  28.  
  29.    
  30.  
  31. class Test 
  32.  
  33.  
  34.     private $proxy
  35.  
  36.    
  37.  
  38.     public function __construct() 
  39.  
  40.     { 
  41.  
  42.         $this->proxy = new Proxy($this); 
  43.  
  44.     } 
  45.  
  46.    
  47.  
  48.     public function __destruct() 
  49.  
  50.     { 
  51.  
  52.         var_dump('__destruct:Test'); 
  53.  
  54.     } 
  55.  
  56.  
  57. $test = new Test; 
  58.  
  59. unset($test); 
  60.  
  61. echo '__destruct now:', PHP_EOL; 
  62.  
  63. gc_collect_cycles(); 
  64.  
  65. sleep(3); 
  66.  
  67. echo 'no operation', PHP_EOL; 

希望對需要的朋友有所幫助!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳东县| 静安区| 龙胜| 明星| 扎鲁特旗| 上高县| 西昌市| 宜黄县| 育儿| 铁力市| 谷城县| 色达县| 丹棱县| 建宁县| 瑞昌市| 南阳市| 濉溪县| 西宁市| 福建省| 喀喇| 东安县| 广灵县| 应城市| 昆明市| 文成县| 社旗县| 尼玛县| 凤翔县| 高雄县| 高清| 吴桥县| 苏州市| 苏尼特右旗| 砚山县| 沈丘县| 长沙市| 田东县| 米脂县| 清苑县| 凌海市| 六安市|