58


8

このコードは56という結果を生成します。

関数x($ y){関数y($ z){return($ z * 2); }

return($ y 3); }

$ y = 4。 $ y = x($ y)* y($ y); echo $ y;

何が中に入っているのですか? 私は混乱しています。

6 Answer


90


Xは値3を返し、Yは値2を返します。

値4を指定すると、これは「(4 3)*(4 * 2)= 7 * 8 = 56」を意味します。

関数の範囲は限定されていませんが(つまり、関数定義を安全に「ネスト」できるという意味です)、この例ではエラーが発生しやすいです。

1)x()を呼び出す前にy()を呼び出すことはできません。関数y()はx()が一度実行されるまで定義されないからです。

2) `x()`を2回呼び出すとPHPは関数 `y()`を宣言し直し、致命的なエラーを引き起こします。

_ 致命的なエラー:y()を再宣言できません _

両方を解決するには、コードを分割して、両方の関数が互いに独立して宣言されるようにします。

function x ($y)
{
  return($y+3);
}

function y ($z)
{
  return ($z*2);
}

これもまたもっと読みやすいです。


26


(4 3)*(4 * 2)== 56

親関数の範囲内でのみ定義されているように、PHPは「入れ子関数」を実際にはサポートしていません。 すべての機能はグローバルに定義されています。 docsを参照してください。


16


そのコードの作者が何を達成したいのかわからない。 ある関数を別の関数の内側で定義しても、内側の関数が外側の関数の内側でしか見えないという意味ではありません。 最初にx()を呼び出した後、y()関数もグローバルスコープ内になります。


6


これは静的プロパティのない再帰、参照などのための便利な概念です。

関数getReqursiveItems($ id){$ allItems = array();

function getItemms($ parent_id){return DB :: findAll() - > where( '`parent_id` = $ parent_id'); }

foreach(getItems($ id)を$ item){$ allItems = array_merge($ allItems、getItems($ item-> id)); }

$ allItemsを返します。 }


5


他の関数の中から関数を定義することは可能です。 内側の関数は外側の関数が実行されるまで存在しません。

echo function_exists( "y")? 'yは定義されています\ n': 'yは定義されていません\ n'; $ x = x(2); echo function_exists( "y")? 'yは定義されています\ n': 'yは定義されていません\ n';

出力

yは定義されていません

yが定義されている

xを実行する前に関数yを呼び出せない簡単なこと


3


あなたのクエリーは7 * 8をやっています

x(4)= 4 3 = 7`と y(4)= 4 * 2 = 8`

関数xが呼び出されると、関数yが作成され、実行されません。