ホームページ  >  記事  >  バックエンド開発  >  PHP の面接の質問で遭遇するいくつかの落とし穴。壁向き

PHP の面接の質問で遭遇するいくつかの落とし穴。壁向き

WBOY
WBOYオリジナル
2016-08-08 09:21:41892ブラウズ

1.ポインタハング問題

$array = [1, 2, 3];

echo implode(',', $array), "n";

foreach ($array as &$value) { } // 参照による

echo implode(',', $array), "n";

foreach ($array as $value) {} // 値による(つまりコピー)

echo implode(', ', $array), "n";

正しい答えは次のようになります:

1,2,3

1,2,2

説明:

それを分析してみましょう。最初のループの後、$value は配列内の最後の要素への参照になります。 2 番目のループが始まります:

ステップ 1: $arr[0]$value にコピーします (この時点では $value$arr[2] であることに注意してください) )、配列は [1,2,1]

になります。ステップ 2: $arr[1]$value にコピーすると、配列は [1 ,2,2 になります。 ]

ステップ 3: $arr[2]$value にコピーすると、配列は [1,2,2]

2. 以下になります 結果出力:

$test=null;

if(isset($test)){

echo "true";

}else{

echo "false";

}

?>

正解: false

説明: isset()関数の場合、変数が存在しない場合はfalseを返し、変数の値がの場合も返します。 nullfalse

変数が実際に設定されているかどうかを判断するには(未設定の値と設定された値nullを区別するため)、array_key_exists()関数の方が良いかもしれません。

3. 次の結果は印刷できますか?その理由は何ですか?

class Config{

private $values = [];

public function getValues() {

return $this->values;

}

}

$ config = new Config();

$config->getValues()['test'] = 'test';

echo $config->getValues()['test'];

正解:

いいえ、 PHP では、明示的に戻り値の参照を指定しない限り、配列 PHP は値の戻り値であり、配列のコピーです。したがって、上記のコードが返された配列に値を割り当てる場合、実際には元の配列ではなく、コピーされた配列に値が割り当てられます。コードを次のように変更すると:

class Config{

private $values = [];

// 実際の $values 配列への REFERENCE を返します

public function &getValues() {

Return $this-> 値;

}

}

$config = new Config();

$config->getValues()['test'] = 'test';

echo $config-> ;getValues()[ 'test'];

は問題ありません。

知識ポイント: PHPでは、オブジェクトのデフォルトは参照によって返され、配列と組み込みの基本型はデフォルトで値によって返されます。これは他の言語とは区別する必要があります (多くの言語は配列を参照によって渡します)。

4. 次のコードを実行すると、サーバーは何を出力しますか?

$.ajax({

URL: 'http://my.site/ndex.php',

メソッド: 'post',

データ: JSON.stringify({a: 'a', b: 'b'}),

contentType: 'application/json'

});

var_dump($_POST);

答え: array(0){}

説明: PHPは、application/x-www-form-urlencodedContent-Type、またはHttpmultipart/form-dataのみを解析します。 リクエスト。その理由は、歴史的な理由によるものです。PHPが最初に実装されたとき、上記の 2 つのタイプが最も人気がありました。したがって、現在、一部の型 (application/jsonなど) は非常に人気がありますが、PHPにはまだ自動処理が実装されていません。 $_POSTはグローバル変数であるため、$_POSTの変更はグローバルに有効になります。したがって、Content-Typeapplication/jsonであるリクエストの場合、jsonデータを手動で解析してから、$_POST変数を変更する必要があります。 $_POST = json_decode(file_get_contents('php://input'), true);これは、WeChat パブリック プラットフォームの開発でも WeChat サーバーのデータを取得するためにこのメソッドを使用する理由を説明しています

post

6次のコードの出力結果は次のとおりです: for ($c = 'a'; $c <= 'z'; $c++) {

echo "n";

}

答え:

a.....z,aa....yz

説明: PHP

には

charデータ型はなく、stringだけがあります。タイプ。これを理解した上で、'z'に対してインクリメント演算を実行すると、結果は'aa'となります。文字列の大きさの比較については、Cを勉強したことがある人なら、'aa''z'よりも小さいことを知っているはずです。これは、上記の出力結果が得られる理由も説明します。 しかし、PHP

では、2 つの純粋な数値文字列を比較する場合、まずそれらを数値として比較しようとします。

著作権声明: この記事はブロガーによるオリジナルの記事であり、ブロガーの許可なく複製することはできません。

上記では、PHP の面接の質問で遭遇するいくつかの落とし穴を紹介しました。内容も含めて壁に立ち向かっていくので、PHPチュートリアルに興味のある友人の参考になれば幸いです。

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