国产探花免费观看_亚洲丰满少妇自慰呻吟_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; 

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 三明市| 广河县| 永清县| 辽中县| 晋州市| 蓬溪县| 扶绥县| 宁陵县| 玉环县| 神木县| 阜宁县| 吴堡县| 吴桥县| 攀枝花市| 安丘市| 台中市| 青岛市| 梧州市| 天等县| 洛宁县| 灵川县| 石泉县| 奈曼旗| 新巴尔虎左旗| 大丰市| 临漳县| 岳普湖县| 商都县| 化州市| 绥棱县| 通渭县| 大田县| 翁源县| 博客| 东城区| 青州市| 天台县| 昌平区| 察隅县| 信宜市| 乌兰察布市|