前回に引き続き,オブジェクト仕様の変更について解説します。PHP5になってからオブジェクト指向プログラミング機能が強化され,Javaなどのオブジェクト思考言語に慣れたユーザにはより使いやすい言語仕様を持つようになりました。まれとは思いますが,PHP5からの新しい機能であるインターフェースも移行時に問題となる可能性も考えられるので,定義済みインターフェースも紹介しています。インターフェースとはメソッド定義がない抽象クラスのようなものです。よく分からない場合はプロパティ・メソッドの中身がないクラスのようなものと考えてください。
特に記述がない場合,PHP4はPHP4.4.x,PHP5はPHP5.2.xを意味します。
定義済みクラス
モジュールをロードするとクラスが定義される場合があるので,環境により定義済みクラスは異なります。ここではデフォルトのXAMMP for Windows 1.6.2のPHP4とPHP5の定義済みクラスの一部を紹介します。
PHP4の定義済みクラス
C:\xampp\php\php4>phpcli.exe -r "print_r(get_declared_classes());"
Array
(
[0] => stdClass
[1] => __PHP_Incomplete_Class
[2] => Directory
[3] => COM
[4] => VARIANT
[5] => swfshape
[6] => swffill
以下省略
PHP5の定義済みクラス
C:\xampp\php>php.exe -r "print_r(get_declared_classes());"
Array
(
[0] => stdClass
[1] => Exception
[2] => ErrorException
[3] => COMPersistHelper
[4] => com_exception
[5] => com_safearray_proxy
[6] => variant
[7] => com
[8] => dotnet
[9] => ReflectionException
[10] => Reflection
[11] => ReflectionFunctionAbstract
[12] => ReflectionFunction
[13] => ReflectionParameter
[14] => ReflectionMethod
[15] => ReflectionClass
[16] => ReflectionObject
[17] => ReflectionProperty
[18] => ReflectionExtension
[19] => DateTime
[20] => DateTimeZone
[21] => LibXMLError
[22] => __PHP_Incomplete_Class
[23] => php_user_filter
以下省略
ここでは省略していますが,get_declared_classes関数の戻り値を参照すると,PHP5には例外クラス,リフレクションAPI関連クラス,XML関連クラスなどが定義されていることが分かります。
PHP5からはInterfaceもサポートしています。このためInterfaceとして定義された名前もクラス名として利用できません。
C:\xampp\php>php.exe -r "print_r(get_declared_interfaces());"
Array
(
[0] => Traversable
[1] => IteratorAggregate
[2] => Iterator
[3] => ArrayAccess
[4] => Serializable
[5] => Reflector
[6] => RecursiveIterator
[7] => OuterIterator
[8] => Countable
[9] => SeekableIterator
[10] => SplObserver
[11] => SplSubject
)
PHP5のデフォルトの定義済みクラスで,最も注意が必要と思われるクラス名はDateTimeクラスです。
例:同じクラス名の利用
<?php
class DateTime{}
$obj = new DateTime;
?>
実行例:
Fatal error: Cannot redeclare class DateTime in C:\xampp\php\- on line 2
どのクラス/インターフェース名でも同じですが,定義済みクラス名またはインターフェース名を利用しようとすると,Fatalエラーとなりスクリプトの実行が停止します。同じクラス名を定義している場合,クラス名を変更しなければなりません。

