検索

unset传递的值是一个对象或者值的复制(比如传递数组,传递的是一个新的复制,而不是引用),结果原对象却被销毁了。好奇怪。
大神快来解答这个问题。以前一直用unset,今天突然想到了这个问题。
比如:

<br><?php


$a='hello';
$b=true;
unset($b);
unset($a);
echo $b;
echo $a;

?>

这时就会报出Undefined variable的错误
正如舞林所说,这种销毁变量的方式有可能是将引用计数减一。
但是这样做:

<?php
$a='hello';
$b=&$a;
unset($a);
echo $a;

?>

这个时候,$a依然被销毁。报出Undefined variable的错误的错误。
如果unsetb,来看看结果:

<?php


$a='hello';
$b=&$a;
unset($b);
echo $a;

?>

只是销毁了$b,$b虽然是$a的引用,但是$a没有被销毁。打印出hello
所以unset的机制并没有那么简单。。

回复内容:

unset传递的值是一个对象或者值的复制(比如传递数组,传递的是一个新的复制,而不是引用),结果原对象却被销毁了。好奇怪。
大神快来解答这个问题。以前一直用unset,今天突然想到了这个问题。
比如:

<br><?php


$a='hello';
$b=true;
unset($b);
unset($a);
echo $b;
echo $a;

?>

这时就会报出Undefined variable的错误
正如舞林所说,这种销毁变量的方式有可能是将引用计数减一。
但是这样做:

<?php
$a='hello';
$b=&$a;
unset($a);
echo $a;

?>

这个时候,$a依然被销毁。报出Undefined variable的错误的错误。
如果unsetb,来看看结果:

<?php


$a='hello';
$b=&$a;
unset($b);
echo $a;

?>

只是销毁了$b,$b虽然是$a的引用,但是$a没有被销毁。打印出hello
所以unset的机制并没有那么简单。。

PHP unset函数好奇怪

第一段代码 a和b是两块不同的内存 所以unset掉两者 根本没影响
第二段代码 b引用a 使得对应的zval ref_count+1 is_ref +1 此时不管unset掉a或者b 只是断了一根引用对另外的那个值没影响 还是指向的那块区域

变量引用次数-1,只要有对该内存块的引用,该内存块就不会被销毁

update:
昨天写答案提交发现服务器在调皮的维护,以为没发出去呢...
TIPI有写具体的内容:
http://www.php-internals.com/book/?p=chapt03/03-01-00-variables-structure
//变量结构体

http://www.php-internals.com/book/?p=chapt03/03-06-01-var-define-and-init
//变量的赋值和销毁,这里详细讲解了引用计数

我觉得你说得好像不成立。。

$o = new stdClass();
$o->var = 123;
$new_o = $o; //等于$new_o = & $o;
unset($new_o);
var_dump($o);

对象赋值本身就是引用赋值,但是unset 引用的变量 只是把引用给销毁了,并不会销毁原变量

我的理解是这个样子

...你 确定?

------------update-------------
把评论里的拿上来
unset只是断开了变量 名和值 之间的绑定

引用:
"该函数只有在变量值所占空间超过256字节长的时候才会释放内存"
&&
"有当指向该值的所有变量(比如有引用变量指向该值)都被销毁后,地址才会被释放"

unset($a)无论你$a是怎么得到的(直接赋值$a=true、传值$a=$b、传址$a=&$b),以及对$a进行过什么操作(传值给别的变量$b=$a或传址$b=&$a),它都会断掉$a的引用,并把$a抹成null。
至于被赋值的那个对象是不受影响的,引用计数自己会处理好。

同意楼上几位的回答,如果LZ的问题依然存在,不妨贴出你的代码可以更好的说明情况。

不过我想通过以下代码给LZ提个醒:

$foo = true;
$bar = &$foo;
unset($foo);
var_dump($bar);  // 结果是true,而不是null

另外反过来一样

$foo = true;
$bar = &$foo;
unset($bar);
var_dump($foo);  // 结果依然是true,而不是null

可以看出:即时向unset传递一个变量的引用,也不会把该变量销毁
所以我不太能理解LZ的问题是怎么一回事……

这段代码是我从别处搜索来的,我认为应该能够解决你的疑问!
如果在函数中 unset() 一个通过引用传递的变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。

<code>  <?php function foo(&$bar) {
     unset($bar);
     $bar = "blah";
    }

$bar = 'something';
echo "$bar ";

foo($bar);
echo "$bar ";
?> 
</code>

上边的例子将输出:

something
something

楼主第二个测试,可以输出$b 试试,一样没有被销毁

参考这个
http://php.net/manual/zh/features.gc.refcounting-basics.php

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPの継続的な使用:その持久力の理由PHPの継続的な使用:その持久力の理由Apr 19, 2025 am 12:23 AM

まだ人気があるのは、使いやすさ、柔軟性、強力なエコシステムです。 1)使いやすさとシンプルな構文により、初心者にとって最初の選択肢になります。 2)Web開発、HTTP要求とデータベースとの優れた相互作用と密接に統合されています。 3)巨大なエコシステムは、豊富なツールとライブラリを提供します。 4)アクティブなコミュニティとオープンソースの性質は、それらを新しいニーズとテクノロジーの傾向に適応させます。

PHPおよびPython:類似点と相違点を調査しますPHPおよびPython:類似点と相違点を調査しますApr 19, 2025 am 12:21 AM

PHPとPythonはどちらも、Web開発、データ処理、自動化タスクで広く使用されている高レベルのプログラミング言語です。 1.PHPは、ダイナミックウェブサイトとコンテンツ管理システムの構築によく使用されますが、PythonはWebフレームワークとデータサイエンスの構築に使用されることがよくあります。 2.PHPはエコーを使用してコンテンツを出力し、Pythonは印刷を使用します。 3.両方ともオブジェクト指向プログラミングをサポートしますが、構文とキーワードは異なります。 4。PHPは弱いタイプの変換をサポートしますが、Pythonはより厳しくなります。 5. PHPパフォーマンスの最適化には、Opcacheおよび非同期プログラミングの使用が含まれますが、PythonはCprofileおよび非同期プログラミングを使用します。

PHPおよびPython:さまざまなパラダイムが説明されていますPHPおよびPython:さまざまなパラダイムが説明されていますApr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPython:彼らの歴史を深く掘り下げますPHPとPython:彼らの歴史を深く掘り下げますApr 18, 2025 am 12:25 AM

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

PHPとPythonの選択:ガイドPHPとPythonの選択:ガイドApr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPとフレームワーク:言語の近代化PHPとフレームワーク:言語の近代化Apr 18, 2025 am 12:14 AM

PHPは、多数のWebサイトとアプリケーションをサポートし、フレームワークを通じて開発ニーズに適応するため、近代化プロセスで依然として重要です。 1.PHP7はパフォーマンスを向上させ、新機能を紹介します。 2。Laravel、Symfony、Codeigniterなどの最新のフレームワークは、開発を簡素化し、コードの品質を向上させます。 3.パフォーマンスの最適化とベストプラクティスは、アプリケーションの効率をさらに改善します。

PHPの影響:Web開発などPHPの影響:Web開発などApr 18, 2025 am 12:10 AM

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?Apr 17, 2025 am 12:25 AM

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境