SimpleBoxes

PHP で少しはまったところをメモしておく試み (2008.02.15)

エラーを無視する

関数の前に「@」をつけます。

$fh = @fopen('dummy.txt','r');
@include('mylibs.php');

この時につける接頭子「@」は、エラー演算子という呼ぶようです。

エラー処理を行う

エラー処理を行う関数として、set_error_handler が用意されています。

set_error_handler が呼び出された後、エラーが発生した場合、set_error_handler で登録した関数でエラー処理が行われます。

perl では、エラー処理を行うため eval ブロックを利用すると、該当ブロック内のエラーを捕捉できます。ブロック外のエラーは捕捉されません。

一方、set_error_handler が一度呼び出されると restore_error_handler を使ってエラー処理を解除するまで、エラーを捕捉し続けます。

<?php
  { // here is eval block
    set_error_handler('myErrorHandler');
    // :
    restore_error_handler();
  } // end of eval block
  function myErrorHandler()
  {
    // do something ...
  }
?>

エラー処理にオブジェクトのメソッドを指定する

set_error_handler で文字列を使うと、該当する名前を持つ関数をグローバルに呼び出します。

エラー処理として、インスタンス $this のメソッドを呼び出したい場合は array を使って関数を引き渡す必要があります。

<?php
  class Hoge
  {
    function Hoge()
    {
      set_error_handler(array($this,'handle_error'));
      // :
      restore_error_handler();
    }
    function handle_error
    {
      // do something ...
    }
  }
?>

クラスメソッド

インスタンスを生成せずに、クラスに定義されたメソッドを呼び出すには、「::」を使います。

クラス名::メソッド名」のように呼び出します。これは perl と一緒。

<?php
  class SomeClass
  {
    function classMethod()
    {
      // do somethimng ...
    }
  }
  
  SomeClass::classMethod();
?>

継承

extends でベースクラスを指定します。

ベースクラスのメソッドを呼び出す時は、予約されている parent というクラス名を使います。

<?php
  class SomeClass extends BaseClass
  {
    function SomeClass()
    {
      parent::__construct();
    }
  }
?>

コンストラクタ

クラス名と同じ名前の関数を定義すると、コンストラクタになります。C++ っぽい流儀です。

php5 では、__construct という関数がコンストラクタとして利用できます。__construct を定義しておけば、自動的に呼ばれるようです。

php4 / php5 共用で利用する場合、以下のようなコードがサンプルとして挙げられています。

<?php
  class SomeClass
  {
    function SomeClass()
    {
      $this->__construct()
    }
    function __construct()
    {
      // do initialization
    }
  }
?>

配列を返す関数

splitexplode など配列を返す関数がいくつかあります。

perl の場合、配列を返す関数に対して、

my $var = ( some_func() )[0];

のようにブラケットで囲むことで、返り値の配列を無名配列として扱い、添字を使って配列の一部の要素だけを抜き出すことが出来ます。

PHP の場合、無名配列という概念がないようなので、上記の場合、

$var = array_shift( some_func() );

のように記述する必要があります。

先頭の要素だけ利用する場合ならば、array_shift でいけますが、途中の要素を抜き出したい場合は、一時変数を使う必要がありそうです。

スポンサーリンク

<< Firefox 3 Beta 3 を使ってみました :: iPod touch ソフトウェアアップグレード >>