PHP変数の引用に関する疑問
nbsp
php
unset
zval
PHP における変数参照に関する混乱
変数の参照と代入についてはすでによく理解しているつもりでしたが、私の理解を完全に覆す次の問題に遭遇しました
<br /> <?php <br /> $str = 'WangChuanbo';<br /> $s = &$str;<br /> unset($str);<br /> echo $s,'hello world';<br /> ?>
ログイン後にコピー
その結果、$s は出力された後も Wangchuanbo のままで、元の変数はアンロードされ、参照変数には値が残っているのではないでしょうか? ?
php
変数参照
------解決策------------------
張飛の姓は張飛、名は張飛です。イデ
です つまり、張飛と張一徳は同一人物です
張飛を殺したということは、張飛という名前を世界から消しただけで、その人物は未だに張一徳
という肩書きで徘徊している-----解決策---------- -- -----------
参照を設定解除します。これは、変数名と変数の内容の間のバインドを解除するだけです
$s = &$str; php では
を意味します $s と $str はどちらも同じ場所 C
を指します 設定を解除した後、$str は C
を見つけることができません 別の例を挙げてみましょう
シャオ・チャンはシャオ・リーから宝物が海にあると聞きました
シャオ・リーは記憶を失っていますが、シャオ・チャンは宝が海にあることをまだ知っています
C では、参照はメモリアドレスさえも同じであることを意味します
最終的には、これは定数ポインタです
-----解決策---------
単純に
を入れます C のポインタはメモリ内の特定のアドレスを指します
C ポインターにはデータ型の概念があるため、ポインターは操作に参加できます
PHP コードはマシンコードにコンパイルされていないため、メモリ アドレスへのアクセスについての話はありません
確かに、PHP の参照機構は C のポインタとよく似ています。ポインタの操作を除けば、少なくともパフォーマンスはポインタ
と同じです。 ---解決策----- ---------------
まず、変数の設定を解除するときは、PHP のガベージ コレクションのメカニズムを理解する必要があります。記憶から消えるわけではありません! PHP のガベージ コレクションは GC によって行われます。
------解決策---------
お気に入りに追加~~
-----解決策---------
もちろん、このように理解することに固執する場合は、笑
F ドライブに fff フォルダーがあるので、右クリックして [送る => デスクトップ ショートカット]
次に、名前を aaa に変更し、もう一度実行して、名前を bbb
に変更します。 aaa を開いてその中に txt を作成し、次に bbb を開くとその中に txt が作成されます
そういうことじゃないですか
-----解決策---------
6 階が正しい、そうする必要がある理解する PHP のガベージコレクションメカニズムを理解する必要があります
PHP 変数は C/C とは異なります。PHP 変数は ZVAL 構造体に格納されます。構造体は次のように定義されます。 typedef struct _zval_struct zval;
...
struct _zval_struct {
/* 変数情報 */
zvalue_value 値; /* 値 */
zend_uint refcount__gc; zend_uchar タイプ; /* アクティブなタイプ */
zend_uchar is_ref__gc;
};
zval 構造体には 4 つのフィールドがあり、それらの意味は次のとおりです:
デフォルト値を意味する属性名
refcount__gc は参照カウント 1 を表します
is_ref__gc は参照 0 かどうかを示します
value には変数
の値が格納されます。 type 変数
の特定の型
unset() は変数を直接破棄しません。refcount=0
の場合にのみ、PHP のガベージ コレクション メカニズムによってリサイクルされます。
$a = 10;
xdebug_debug_zval('a'); //出力: a: (refcount=1, is_ref=0)=10
$b = &$a;
xdebug_debug_zval('a'); //出力: a: (refcount=2, is_ref=1)=10
$a = 20;
xdebug_debug_zval('a'); //出力: a: (refcount=2, is_ref=1)=20
unset($b);
xdebug_debug_zval('a'); //出力: a: (refcount=1, is_ref=0)=20
-----解決策--------------------------------
実際、多くの人が引用符を解釈しています。誰もが PHP の基礎となる実装について話したがりますが、実際にはこれは間違っています。
説明は深い原則ではなく、単純な原則に基づいて行う必要があります。そうしないと、ますます混乱してしまいます
C 言語の本では、高レベルの人がまだ理解していないため、ポインタの説明にアセンブリ言語を使用しないのと同じように、低レベルの人はどうやって理解できるのでしょうか
PHP 参照はポインタと同様に動作します。したがって、「ポインタ」と考えて問題ありません 参照を「ポインタ」として扱わないでください
それを理解する別の方法は
です。 ポインタは番地に従って商店街の各店舗に出入りするので、次の店舗がどこにあるのか明確にわかります
引用はお店の看板に従って出入りするので、隣に誰がいるのか分かりません
それ以外は、両者にパフォーマンスの差はありません
-----解決策---------
------解決策------------------
張飛の姓は張飛、名は張飛です。イデ
です つまり、張飛と張一徳は同一人物です
張飛を殺したということは、張飛という名前を世界から消しただけで、その人物は未だに張一徳
という肩書きで徘徊している-----解決策---------- -- -----------
参照を設定解除します。これは、変数名と変数の内容の間のバインドを解除するだけです
$s = &$str; php では
を意味します $s と $str はどちらも同じ場所 C
を指します 設定を解除した後、$str は C
を見つけることができません 別の例を挙げてみましょう
シャオ・チャンはシャオ・リーから宝物が海にあると聞きました
シャオ・リーは記憶を失っていますが、シャオ・チャンは宝が海にあることをまだ知っています
C では、参照はメモリアドレスさえも同じであることを意味します
最終的には、これは定数ポインタです
-----解決策---------
単純に
を入れます C のポインタはメモリ内の特定のアドレスを指します
C ポインターにはデータ型の概念があるため、ポインターは操作に参加できます
PHP コードはマシンコードにコンパイルされていないため、メモリ アドレスへのアクセスについての話はありません
確かに、PHP の参照機構は C のポインタとよく似ています。ポインタの操作を除けば、少なくともパフォーマンスはポインタ
と同じです。 ---解決策----- ---------------
まず、変数の設定を解除するときは、PHP のガベージ コレクションのメカニズムを理解する必要があります。記憶から消えるわけではありません! PHP のガベージ コレクションは GC によって行われます。
------解決策---------
お気に入りに追加~~
-----解決策---------
もちろん、このように理解することに固執する場合は、笑
F ドライブに fff フォルダーがあるので、右クリックして [送る => デスクトップ ショートカット]
次に、名前を aaa に変更し、もう一度実行して、名前を bbb
に変更します。 aaa を開いてその中に txt を作成し、次に bbb を開くとその中に txt が作成されます
そういうことじゃないですか
-----解決策---------
6 階が正しい、そうする必要がある理解する PHP のガベージコレクションメカニズムを理解する必要があります
PHP 変数は C/C とは異なります。PHP 変数は ZVAL 構造体に格納されます。構造体は次のように定義されます。 typedef struct _zval_struct zval;
...
struct _zval_struct {
/* 変数情報 */
zvalue_value 値; /* 値 */
zend_uint refcount__gc; zend_uchar タイプ; /* アクティブなタイプ */
zend_uchar is_ref__gc;
};
zval 構造体には 4 つのフィールドがあり、それらの意味は次のとおりです:
デフォルト値を意味する属性名
refcount__gc は参照カウント 1 を表します
is_ref__gc は参照 0 かどうかを示します
value には変数
の値が格納されます。 type 変数
の特定の型
unset() は変数を直接破棄しません。refcount=0
の場合にのみ、PHP のガベージ コレクション メカニズムによってリサイクルされます。
$a = 10;
xdebug_debug_zval('a'); //出力: a: (refcount=1, is_ref=0)=10
$b = &$a;
xdebug_debug_zval('a'); //出力: a: (refcount=2, is_ref=1)=10
$a = 20;
xdebug_debug_zval('a'); //出力: a: (refcount=2, is_ref=1)=20
unset($b);
xdebug_debug_zval('a'); //出力: a: (refcount=1, is_ref=0)=20
-----解決策--------------------------------
実際、多くの人が引用符を解釈しています。誰もが PHP の基礎となる実装について話したがりますが、実際にはこれは間違っています。
説明は深い原則ではなく、単純な原則に基づいて行う必要があります。そうしないと、ますます混乱してしまいます
C 言語の本では、高レベルの人がまだ理解していないため、ポインタの説明にアセンブリ言語を使用しないのと同じように、低レベルの人はどうやって理解できるのでしょうか
PHP 参照はポインタと同様に動作します。したがって、「ポインタ」と考えて問題ありません 参照を「ポインタ」として扱わないでください
それを理解する別の方法は
です。 ポインタは番地に従って商店街の各店舗に出入りするので、次の店舗がどこにあるのか明確にわかります
引用はお店の看板に従って出入りするので、隣に誰がいるのか分かりません
それ以外は、両者にパフォーマンスの差はありません
-----解決策---------
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事
R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最高のグラフィック設定
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
アサシンのクリードシャドウズ:シーシェルリドルソリューション
1週間前
By DDD
R.E.P.O.誰も聞こえない場合はオーディオを修正する方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
Atomfallのクレーンコントロールキーカードを見つける場所
1週間前
By DDD

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP でデータベースを操作するのは非常に簡単です。この章では、CRUD (作成、読み取り、更新、削除) 操作について理解します。

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー
