ウェブアプリケーション開発の定番言語であるPHP言語を、言語仕様から実用的なプログラミングテクニックまで詳細に解説しています。PHP言語のコア機能である、強力な文字列処理や配列処理、改善されたオブジェクト指向プログラミングのサポートなどはもちろん、拡張モジュールと組み合わせてデータベースを使用したり、グラフを描画したり、XMLファイルを解析したりなど、実践的なテクニックも網羅しています。本書をマスターすれば、PHP言語の動作原理を理解して、PHPに付属する多くの拡張モジュールの使用方法を身に付け、自分でPHPのウェブアプリケーションを設計して作成できるようになるでしょう。PHP言語を扱うすべてのユーザのための本格的解説書です。
プログラミングPHP 第3版
        
          Kevin Tatroe、Peter MacIntyre、Rasmus Lerdorf 著、高木 正弘 訳
        
      
      ![[cover photo]](https://www.oreilly.co.jp/books/images/picture_large978-4-87311-668-6.jpeg) 
        - TOPICS
- Web , PHP
- 発行年月日
- 2014年03月
- PRINT LENGTH
- 416
- ISBN
- 978-4-87311-668-6
- 原書
- Programming PHP, 3rd Edition
- FORMAT
正誤表
書籍発行後に気づいた誤植や更新された情報を掲載しています。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷数をご確認の上、ご利用ください。
第1刷正誤表
プログラミングPHP 第3版
2015年7月22日更新
| 
		
                位置
		 | 
		誤
		 | 
		正
		 | 
| 
                全体を 通じて | 
		PHP_SELF
		 | 
		SCRIPT_NAME
		 | 
| 
                p8 例1-1 | 
<html>
  <head>
    <title>Look Out World</title>
  </head>
  <body>
    <?php echo "Hello, world!"; ?>
<html>
  <head>
    <title>Look Out World</title>
  </head>
  <body>
    <?php echo "Hello, world!"; ?>
  </body>
</html>
 | 
<html>
  <head>
    <title>Look Out World</title>
  </head>
  <body>
    <?php echo "Hello, world!"; ?>
  </body>
</html>
(赤字箇所6行削除。原書errataに従い修正)
 | 
| 
                p11 図1-5の | 
このサンプルデータベースのSQLは、library.sqlというファイルにあります。
		 | 
このサンプルデータベースのSQLは、http://examples.oreilly.com/0636920012443/からダウンロードできます。
		 
(原書errataに従い修正)
 | 
| 
                p25 下から 2番目の コード片 | 0b01100000 // 10進形式では1 0b00000010 // 10進形式では2 -0b10 // 10進形式では-2 | 0b01100000 // 10進形式では96 0b00000010 // 10進形式では2 -0b10 // 10進形式では-2 
(原書errataに従い修正)
 | 
| 
                p27 下から 8行目 | 
echo "aとbは等しい"
		 | 
echo "aとbは等しい";
		 
(セミコロン追加。原書errataに従い修正)
 | 
| 
                p28 6番目の 箇条書き | 
●プロパティメソッドを一切含まないオブジェクト
		 | 
削除
		 
(原書errataに従い修正)
 | 
| 
                p31 一番下の コード片 | 
$callback = function myCallbackFunction()
{
    echo "コールバックに到達しました";
}
call_user_func($callback);
コールバックに到達しました
 | 
$callback = function () {
    echo "コールバックに到達しました";
};
call_user_func ( $callback );
コールバックに到達しました
(原書errataに従い修正)
 | 
| 
                p38 表2-3 下から 6、5行目 左側カラム | 
5    L   =
     L   +=、-=、…
 | 
5    R   =
     R   +=、-=、…
(原書errataに従い修正)
 | 
| 
                p40 最終行 | "9 Lives." - 1; // 8 (float) | "9 Lives" - 1; // 8 (float) 
(ピリオド削除。原書errataに従い修正)
 | 
| 
                p43 図2-7 下から 3、2行目 | 数値形式でない文字列 数値 数値による比較 数値形式の文字列 数値形式でない文字列 辞書順による比較 | 数値形式でない文字列 数値 辞書順による比較 数値形式の文字列 数値形式でない文字列 数値による比較 
(原書errataに従い修正)
 | 
| 
                p72 1番目の コード片 | global $var; $var = $GLOBALS['var']; | global $var; $var = & $GLOBALS['var']; 
(&追加。原書errataに従い修正)
 | 
| 
                p85 一番下の コード片 | 
if (print("test")) {
  print("動いたよ!");
}
動いたよ!
 | 
if (print("test"\n)) {
  print("動いたよ!");
}
test
動いたよ!
(原書errataに従い修正)
 | 
| 
                p141 上方の コード片 | 
$callback = function printRow($value, $key)
{
  print("<tr><td>{$value}</td><td>{$key}</td></tr>\n");
};
$person = array('name' => "Fred", 'age' => 35, 'wife' => "Wilma");
array_walk($person, $callback);
 | 
$printRow = function ($value, $key)
{
  print("<tr><td>{$key}</td><td>{$value}</td></tr>\n");
};
$person = array('name' => "Fred", 'age' => 35, 'wife' => "Wilma");
echo "<table border=1>" ;
array_walk($person, $printRow);
echo "</table>" ;
(原書errataに従い修正)
 | 
| 
                p142 中央の コード片 | 
$callback = function addItUp($runningTotal, $currentValue)
{
  $runningTotal += $currentValue * $currentValue;
  return $runningTotal;
};
$numbers = array(2, 3, 5, 7);
$total = array_reduce($numbers, $callback);
echo $total;
87
 | 
$addItUp = function ($runningTotal, $currentValue)
{
  //echo $runningTotal . " " . $currentValue . "<br/>" ;
  $runningTotal += $currentValue * $currentValue;
  return $runningTotal;
};
$numbers = array(2, 3, 5, 7);
$total = array_reduce($numbers, $addItUp);
echo "<br/> TOTAL: " . $total;
87
(原書errataに従い修正)
 | 
| 
                p43 例5-2 | 
例5-2 配列の検索
<?php
function hasRequired($array, $requiredFields)
{
  $keys = array_keys($array);
  foreach ($requiredFields as $fieldName) {
    if (!in_array($fieldName, $keys)) {
      return false;
    }
  }
  return true;
}
if ($_POST['submitted']) {
  echo "<p>あなたはすべての必須入力項目を";
  echo hasRequired($_POST, array('name', 'email_address')) ? "入力しました。" : "入力し
終えていません。</p>";
} ?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
  <p>名前: <input type="text" name="name" /><br />
  メールアドレス: <input type="text" name="email_address" /><br />
  年齢(任意): <input type="text" name="age" /></p>
<p align="center"><input type="submit" value="送信" name="submitted" /></p>
</form>
 | 
例5-2 配列の検索
<?php
function hasRequired($array, $requiredFields) {
  $array =
  $keys = array_keys ( $array );
  foreach ( $requiredFields as $fieldName ) {
    if (! in_array ( $fieldName, $keys )) {
      return false;
    }
  }
  return true;
}
if ($_POST ['submitted']) {
  $testArray = array_filter($_POST);
  echo "<p>あなたはすべての必須入力項目を ";
  echo hasRequired ( $testArray, array (
      'name',
      'email_address'
  ) ) ? "入力しました。" : "入力し終えていません。</p>";
}
?>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="POST">
  <p>
    名前: <input type="text" name="name" /><br /> 
    メールアドレス: <input type="text" name="email_address" /><br /> 
    年齢(任意): <input type="text" name="age" />
  </p>
  <p align="center">
    <input type="submit" value="送信" name="submitted" />
  </p>
</form>
(原書errataに従い修正)
 | 
| 
                p163 下から 7行目 | class SupernaturalPerson | class SupernaturalPerson extends Person 
(原書errataに従い修正)
 | 
| 
                p168 一番下の コード片 | 
trait Logger
{
  public log($logString)
 | 
trait Logger
{
  public function log($logString)
(原書errataに従い修正)
 | 
| 
                p169 上から 9行目 | public addUser(User $user) | public function addUser(User $user) 
(原書errataに従い修正)
 | 
| 
                p169 下の コード片 | 
trait First
{
  public doFirst()
  {
    echo "first\n";
  }
}
trait Second
{
  public doSecond()
  {
    echo "second\n";
  }
}
trait Third
{
  use First, Second;
  public doAll()
  {
    $this->doFirst();
    $this->doSecond();
  }
}
 | 
trait First
{
  public function doFirst()
  {
    echo "first\n";
  }
}
trait Second
{
  public function doSecond()
  {
    echo "second\n";
  }
}
trait Third
{
  use First, Second;
  public function doAll()
  {
    $this->doFirst();
    $this->doSecond();
  }
}
(原書errataに従い修正)
 | 
| 
                p181 下から 3行目〜 p182 1行目 | 
if (!session_is_registered('l')) {
  $logger = new Log("/tmp/persistent_log");
  session_register('l');
  $logger->write("作成時刻 $now");
 | 
if (!isset($_SESSION['logger'])) {
  $logger = new Log("/tmp/persistent_log");
  $_SESSION['logger'] = $logger;
  $logger->write("作成時刻 $now");
(原書errataに従い修正)
 | 
| 
                p192 例7-4 | 
例7-4 GETメソッドを使用した温度変換(temp2.php)
<html>
<head><title>温度の変換</title></head>
<body>
<?php $fahrenheit = $_GET['fahrenheit'];
if (is_null($fahrenheit)) { ?>
  <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET">
    華氏の温度を入力します。
    <input type="text" name="fahrenheit" /><br />
    <input type="submit" value="摂氏に変換! " />
  </form>
<?php }
else {
   $celsius = ($fahrenheit - 32) * 5 / 9;
   printf("%.2fF は %.2fC です", $fahrenheit, $celsius);
} ?>
</body>
</html>
 | 
例7-4 GETメソッドを使用した温度変換(temp2.php)
<html>
<head>
<title>温度の変換</title>
</head>
<body>
<?php
if (isset ( $_GET ['fahrenheit'] )) {
  $fahrenheit = $_GET ['fahrenheit'];
} else {
  $fahrenheit = null;
}
if (is_null ( $fahrenheit )) {
    ?>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="GET">
    華氏の温度を入力します。 <input type="text" name="fahrenheit" /><br />
    <input type="submit" value="摂氏に変換!" />
  </form>
<?php
} else {
  $celsius = ($fahrenheit - 32) * 5 / 9;
  printf ( "%.2fF は %.2fCです", $fahrenheit, $celsius );
}
?>
</body>
</html>
(原書errataに従い修正)
 | 
| 
                p196 中央あたり | 
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET">
  当てはまる項目を選択してください。<br />
  <?php makeCheckboxes('attributes', $attrs, $personalityAttributes); ?><br />
 | 
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET">
  当てはまる項目を選択してください。<br />
  <?php makeCheckboxes('attributes[]', $attrs, $personalityAttributes); ?><br />
(原書errataに従い修正)
 | 
| 
                p209 例7-13 1〜6行 | <html> <head><title>設定の登録</title></head> <body> <?php session_start(); $colors = array( | <?php session_start() ?> <html> <head><title>設定の登録</title></head> <body> <?php $colors = array( 
(原書errataに従い修正)
 | 
| 
                p228 4行目 | $comments = fread($file_handle, filesize($filename)); | $comments = file_get_contents($filename) ; 
(原書errataに従い修正)
 | 
| 
                p289 3行目 | $err = xml_get_error_code(); | $error = xml_get_error_code(); 
(原書errataに従い修正)
 | 
| 
                p289 一番下の コード片 | 
$error = xml_get_error_code($parser);
if ($error != XML_ERROR_NONE) {
  die(xml_error_string($err));
}
 | 
$error = xml_get_error_code($parser);
if ($error != XML_ERROR_NONE) {
  die(xml_error_string($error));
}
(原書errataに従い修正)
 | 
| 
                p295 1〜2行目 | 
たとえばBookList.xmlからすべての書籍のタイトルを表示するには、次のようにします。 $document = simplexml_load_file("BookList.xml"); | 
たとえばbooks.xmlからすべての書籍のタイトルを表示するには、次のようにします。 $document = simplexml_load_file("books.xml"); 
(原書errataに従い修正)
 | 
| 
                p295 中央の コード片 | 
$document = simplexml_load_file("BookList.xml");
foreach ($document->children() as $book) {
  $book->title = "新しいタイトル";
}
file_put_contents("BookList.xml", $document->asXml());
 | 
$document = simplexml_load_file("books.xml");
foreach ($document->children() as $book) {
  $book->title = "新しいタイトル";
}
file_put_contents("books.xml", $document->asXml());
(原書errataに従い修正)
 |