CakeFest 2017 NYC, the Official CakePHP Conference


PHP 5 では、新しいオブジェクトモデルが採用されています。 PHP におけるオブジェクトの処理は完全に書き直され、性能と機能が向上しています。 以前のバージョンでは、(integer や string といった) 通常の型と同じようにオブジェクトを扱っていました。 この方式の欠点は、変数にオブジェクトを代入したり メソッドのパラメータとしてオブジェクトを渡した場合に オブジェクト全体がコピーされてしまうということでした。 新しい方式では、オブジェクトを指すハンドルを用いてオブジェクトを管理します。 値そのものを管理するのではなくなります (ハンドルというのは、 要はそのオブジェクトの ID のことです)。

Many PHP programmers aren't even aware of the copying quirks of the old object model and, therefore, the majority of PHP applications will work out of the box, or with very few modifications.

新しいオブジェクトモデルについては 言語リファレンス を参照ください。

PHP 5 では、クラス名と同じ名前の関数がそのクラス内で定義されている場合にのみ それがコンストラクタとしてコールされます。 PHP 4 では、同じクラスだけでなく親クラスで定義されている場合にもコールされていました。

PHP 4 との互換性については、 zend.ze1_compatibility_mode ディレクティブも参照ください。

add a note add a note

User Contributed Notes 3 notes

bdas at premiergroup dot uk dot com
9 years ago
Since PHP5 upgraded PHP to an OOP language, they CHANGED the metaphor so that when you copy an object, you just get a pointer to it (as in C# and Java) and so therefore they needed to make a way to CLONE objects as well in case you need a REAL copy of the object.

Most cases, clone is not needed, simply because a real copy of an object is usually not mandatory.  In special cases, object cloning can be used to save time in porting.
quinn at strangecode dot com
10 years ago
Here is another possible solution for migrating code to php 5 when using $this = 'something' reassignments. In my case, I had several classes  with methods that were self-instantiating with static calls. I was able to simply use a different variable: I changed $this to $_this and it worked the same because I copied an instance of the original object by reference using an instantiation factory method:

class DB {
    function &getInstance()
        static $instance = null;

        if ($instance === null) {
            $instance = new DB();

        return $instance;

In every method needing access to this object I assigned it to a temporary variable by reference:
    function doSomething ()
        $_this =& DB::getInstance();

        $_this->param['id'] = 123;

Which allows method calls or saving data back to the original object.

I originally created classes like this so I didn't need to keep track of instantiations or global objects. I could just call DB::doSomething() and the object is created dynamically or referenced from an already existing object.
9 years ago
You should be able to clone a object in compatibility of PHP4,PHP5 with:
To Top