Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

「Yahoo!がPHPエンジニアを雇う時に聞く質問」に解答付けてみた

先日のエントリですが、とりあえず適当に解答付けてみました。間違いがあれば、バシバシ指摘してやってください :-)
1.配列usersに「john」を追加しないのはどれか?

1. $users[] = ‘john’;
2. array_add($users,’john’);
3. array_push($users,‘john’);
4. $users ||= ‘john’;

2と4。
4についてはid:Tetsujinさんがホントに実装しようとしてますね。



2. sort(), assort(), ksort()の違いを述べよ。また、どういった状況で利用するかを述べよ。

  • sort():配列の値でソート。昇順
  • asort():配列の値でソート。昇順。キーと値の関係は保持される
  • ksort():配列のキーでソート。昇順。キーと値の関係は保持される

「どういった状況で・・・」というのは、すぐ思いつかない。。。
なお、「assort()」と書いてましたが、「asort()」の誤りでした。



3. 以下のコードは何を出力するか?それはなぜか?

$num = 10;
function multiply(){
    $num = $num * 10;
}
multiply();
echo $num;

10。グローバルスコープの$numと関数内スコープの$numは別扱いだから。



4. 参照と通常の変数の違いを述べよ。また、どのように参照渡しをするか、なぜそうするかを述べよ。

Cでのポインタと同じく、値を入れる箱ごと受け渡しするのか、値だけを受け渡しするのかの違い。PHP4.?までは、関数定義・関数呼び出し共に「&」を付ける。php.iniの設定にも依存してた気がするが、ディレクティブは失念。。。

<?php
function some_function(&$arg) {
    return $arg + 1;
}
$a = 1;
echo some_function(&$a);  // 2

それ以降は関数定義側だけでOK。

<?php
function some_function(&$arg) {
    return $arg + 1;
}
$a = 1;
echo some_function($a);  // 2



5. 実行中のスクリプトにライブラリコードを追加する関数は何か?

dl()



6. foo() と @foo()の違いを述べよ。

「@」を付けると、エラーメッセージの出力を抑制する。



7. あなたがどのようにPHPアプリをデバッグしているかを述べよ。
var_dump!(^^;

8. 「===」は何をするか? 「==」がtrueを返し「===」がtrueを返さないサンプルを示せ。

<?php
var_dump(1 == '1');
var_dump(1 === '1');
var_dump(1 == true);
var_dump(1 === true);

などなど。



9. メソッドやプロパティを持たないクラス「myclass」はどのように宣言するかを示せ。

<?php
class myclass {}



10. 「myclass」のインスタンスをどうやって生成するかを述べよ。

<?php
class myclass {}
$myclass = new myclass();



11. どうやってクラスのプロパティにアクセスしたり値を設定するかを述べよ。

<?php
echo $object->property;
$object->property = 1;

PHP5の場合、基底クラスの場合はpublic宣言されている、また、サブクラスの場合は親クラスでpublicもしくはprotected宣言されている必要がある。



12. includeとinclude_onceの違いを述べよ。また、includeとrequireの違いを述べよ。
外部スクリプトファイルを読み込むが、include_onceは一度しか読み込まない。includeは実行時、requireはパース時に処理される。

13. ブラウザに新しいページにリダイレクトさせるための関数は何か?

1. redir()
2. header()
3. location()
4. redirect()

2



14. ファイルを読み書きするため、ファイルを「開く」関数どれか?

1. fget();
2. file_open();
3. fopen();
4. open_file();

3



15. mysql_fetch_row()とmysql_fetch_array()の違いを述べよ。

OCIと同じ感じなら、両方ともデータを配列で返すがfetch_arrayの方は連想配列デカエスとかを指定できたような気がする。。。



16. 以下のコードは何をするか?起こっていることを説明せよ。

$date=’08/26/2003’;
print ereg_replace(“([0-9]+)/([0-9]+)/([0-9]+)”,\\2/\\1/\\3,$date);

これ、引っかけなのかなぁ。正規表現の後方参照のところに「"」「'」がないけど。もしあれば、「26/08/2003」が出力される。



17. $stringにテキストが代入されているとき、HTMLタグを全て除去する正規表現はどのように書けば良いか?

]+>」なところか?不十分そうだ。。。



18. PHPPerlにおいて、配列とハッシュの扱い方の違いを述べよ。

PHPは両者とも内部ではハッシュとして扱われる。Perlは区別してたように記憶してるけど。。。分かりません。



19. HTTPのステートレスな性質を避ける方法を述べよ。

セッションを使う。



20. GDライブラリは何をするかを述べよ。

画像の生成・編集



21. HTMLコードブロックを出力するいくつかの例を挙げよ。

<?php
echo "<h1>Hello, World!</h1>";
?>
<h2>Hello, World!</h2>

ってことなのか?



22. PHPPerlより優れているか、論じよ。

優れているかどうかは求めてない。何度も言うけど、適材適所。

追記(添削とかいろいろ)

  • 「includeとrequireって違いはないんじゃなかったけか」(id:koyhogeさん)
    • 実際に動かしてみました。仰るとおりですね。。。orz パース時ではなく、両方とも関数実行時に評価されました。あ〜。あれはPHP3の話か。。。まあ、以下のように思っていたわけです。
<?php
require 'require.php';       // 存在するファイル

// 以下のif文を「if (1)」にするとエラーになるのは当然
if (0) {
    require 'require2.php';  // 存在しない。これがエラーになると思ってたが、エラーにならない
}
if (0) {
    include 'include2.php';  // 存在しない。こっちはエラーにならないと思ってたし、実際もそう
}
  • PHPの参照はCみたいにポインタで演算ができないからCと感覚が違うんだよなぁ。エイリアスって言われた方がしっくりくる」(id:Kiskeさん)
    • 確かにそうですね。やっぱ、「参照」はポインタではなくあくまで「参照」であって、それ以上でもそれ以下でもない、ってことですねぇ。
  • id:Sybianさんやid:gomisさんがトラックバックで指摘していますが、問17の正規表現では甘過ぎですね:-(