zenith: 2007年5月アーカイブ

どれぐらい?

自分がどれぐらいの実力なのか、どの程度評価されるのか、結構気になります。Yahoo!がPHPエンジニアを雇う時に聞く質問 は、それを確かめる良い機会です。

unesco.png 石見銀山だって、自分が世界に通用するか試してみたかったのかも知れません。

問題と解答

1.配列usersに「john」を追加しないのはどれか?

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

1: 配列の末尾に追加。 2: array_add は未定義の関数。 3: 配列の末尾に追加。 4: 論理和を使う配列演算子?し、知らないぞ… うーん、2 と 4 がそれっぽい。

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

sort() は値で並び替え。assort() …は聞いたことない。asort() のタイポかな。asort の場合も値で並び替え。あれ、sort と asort の違いがない…

bool asort ( array &array [, int sort_flags] ) この関数は、 連想配列において各配列のキーと要素との関係を維持しつつ配列をソートします。 この関数は、 主に実際の要素の並び方が重要である連想配列をソートするために使われます。

bool sort ( array &array [, int sort_flags] ) この関数は配列をソートします。この関数が正常に終了すると、 各要素は低位から高位へ並べ替えられます。

なるほど、ソート後の配列のキーが振り直されるか維持されるかの違いかー。配列とハッシュで確かめてみる。

////////////////////
// 配列の sort
$list = array(1, 2, 3);
unset($list[1]);
sort($list);
var_dump($list);
// array
//   0 => int 1
//   1 => int 3

////////////////////
// 配列の asort
$list = array(1, 2, 3);
unset($list[1]);
asort($list);
var_dump($list);
// array
//   0 => int 1
//   2 => int 3

////////////////////
// ハッシュの sort
$hash = array('one' => 1, 'two' => 2, 'three' => 3);
sort($hash);
var_dump($hash);
// array
//   0 => int 1
//   1 => int 2
//   2 => int 3

////////////////////
// ハッシュの asort
$hash = array('one' => 1, 'two' => 2, 'three' => 3);
asort($hash);
var_dump($hash);
// array
//   'one' => int 1
//   'two' => int 2
//   'three' => int 3

納得。ksort() はキーで並び替え。

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

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

出力は "10"。理由は multiply() 内の $num はスコープが違うため、グローバル変数の $num と関係がないから。

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

通常の変数は、一つの実体に一つの名前を付けて内容へアクセスする関係。参照は、一つの実体に複数の名前を付け、それぞれから内容へアクセスできる関係。

参照方法は次の通り。

$array = array();

// 参照の作成
$reference =& $array;

// 参照渡し
function foo1(&$array)
{
}


// 参照返し
function & bar1()
{
    $array = array();
    return $array;
}


class Foobar
{
}

// インスタンスの作成 by PHP4
$foobar =& new Foobar();


// オブジェクトの参照の作成 by PHP4
$reference =& $foobar;

// オブジェクトの参照渡し by PHP4
function foo2(&$foobar)
{
}

// オブジェクトの参照返し by PHP4
function & bar2()
{
    $foobar =& new Foobar();
    return $foobar;
}


// インスタンスの作成 by PHP5
$foobar = new Foobar();

// オブジェクトの参照の作成 by PHP5
$reference = $foobar;

// オブジェクトの参照渡し by PHP5
function foo3(Foobar $foobar)
{
}

// オブジェクトの参照返し by PHP5

function bar3()
{
    $foobar = new Foobar();
    return $foobar;
}

なぜそうするか?インスタンスを複製したくない時に必要。

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

include, include_once, require, require_once。同等の事を eval, create_function でも可能かな。

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

@ はエラー制御演算子。foo ではエラーが発生する場合でも、@foo ではエラーを発生させない。

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

Eclipse + PDT + ZendDebugger。もしくは Eclipse + PDT + Xdebug Zend エクステンション。

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

型を含めた等しい比較。

var_dump(1 == true); // true
var_dump(1 === true); // false

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

class myclass
{
}

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

キーワード "new " でインスタンスを作成する。

class myclass
{
}

$myclass =& new myclass();

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

アロー演算子(->)でオブジェクトとプロパティを結ぶ。

class myclass
{
	public $foo = 0;
}

$myclass =& new myclass();
$myclass->foo = 1;

12. includeとinclude_onceの違いを述べよ。また、includeとrequireの違いを述べよ。

include は呼び出した個所全てで指定されたファイルを読み込むのに対し、include_once は最初に呼び出した1個所でのみファイルを読み込む。include と require の違いは、発生するエラーレベルが違う。include は E_WARNING で require は E_ERROR。

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

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

header() で Location ヘッダを出力する事。

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

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

fopen()。

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

mysql_fetch_row は結果行をカラム番号をキーとした配列で受け取る。mysql_fetch_array は結果行をカラム名・カラム番号・または両方をキーとした配列で受け取る。

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

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

ereg_replace でおそらくパーサがエラーを出す。

\\2/\\1/\\3 の部分がただのタイポとした場合、正規表現 "([0-9]+)/([0-9]+)/([0-9]+)" にマッチする $date のトークン "08" と "26" を入れ替え、新しい文字列 "26/08/2003" を出力している。

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

preg_replace('/<[^>]*>/, '', $string);

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

PHP では両者とも同じ扱い。Perl では別物。

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

ステートレス?な、なんの事だ…。

日本語
状態非維持
英語
stateless
日本語
状態非維持
ふりがな
すてーとれす
フリガナ
ステートレス
説明
ソケット接続を処理単位で切断すること。

ふむふむ。接続が終わっても状態を維持するとなるとセッションを使えって事かな。サーバはクライアント毎にセッション ID を発行し、状態とセッション ID を対にして保存する。次回要求時にクライアントからセッション ID を送信させる事で状態を維持させる。セッション ID の受け渡しには Cookie を使うか、レスポンス内のハイパーリンクやフォームにセッション ID を埋め込む。

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

画像データのバイナリをいじったり読み込んだり書き出したり。

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

echo '<p>PHP</p>';
print('<p>PHP</p>');
fwrite(fopen('php://output', 'a'), '<p>PHP</p>');
?><p>PHP</p><?php
exit '<p>PHP</p>';

22. PHPはPerlより優れているか、論じよ。

Perl は 5.8 以降ほとんどやってないのでパスっ。ただ、いろんな言語を使う機会が多いと、クセの少ない文法の PHP が楽だと思います。

自己採点

2, 12, 19 がアウト。12の問題、require は E_WARNING を出し(!)、さらに E_ERROR も発行する…なんて知らなかった…。1 もあやふや。いかにいい加減にやってきたかがバレちゃう。Perl 関連の 18, 22 も痛い。Perl は昔かなりお世話になったけど、今じゃすっかり文法忘れたなぁ。でも嫌いじゃないです。構文はとっつきにくいけど、慣れたらとっても良い子で。ツンデレ言語。

残念ですが不採用です

くぅー自信あったのに全然だめだ。こんなんじゃ夕ご飯がジャガリコ生活を卒業できないぞ、がんばれ自分!