PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Autoloading Objects> <Classes and Objects (PHP 5)
Last updated: Sat, 24 Mar 2007

view this page in

The Basics

class

Every class definition begins with the keyword class, followed by a class name, which can be any name that isn't a reserved word in PHP. Followed by a pair of curly braces, which contains the definition of the classes members and methods. A pseudo-variable, $this is available when a method is called from within an object context. $this is a reference to the calling object (usually the object to which the method belongs, but can be another object, if the method is called statically from the context of a secondary object). This is illustrated in the following examples:

Příklad 19.1. $this variable in object-oriented language

<?php
class A
{
    function
foo()
    {
        if (isset(
$this)) {
            echo
'$this is defined (';
            echo
get_class($this);
            echo
")\n";
        } else {
            echo
"\$this is not defined.\n";
        }
    }
}

class
B
{
    function
bar()
    {
       
A::foo();
    }
}

$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
?>

Výše uvedený příklad vypíše:


$this is defined (a)
$this is not defined.
$this is defined (b)
$this is not defined.

     

Příklad 19.2. Simple Class definition

<?php
class SimpleClass
{
   
// member declaration
   
public $var = 'a default value';

   
// method declaration
   
public function displayVar() {
        echo
$this->var;
    }
}
?>

The default value must be a constant expression, not (for example) a variable, a class member or a function call.

Příklad 19.3. Class members' default value

<?php
class SimpleClass
{
   
// invalid member declarations:
   
public $var1 = 'hello '.'world';
    public
$var2 = <<<EOD
hello world
EOD;
    public
$var3 = 1+2;
    public
$var4 = self::myStaticMethod();
    public
$var5 = $myVar;

   
// valid member declarations:
   
public $var6 = myConstant;
    public
$var7 = self::classConstant;
    public
$var8 = array(true, false);
   
   
}
?>

Poznámka: There are some nice functions to handle classes and objects. You might want to take a look at the Class/Object Functions.

new

To create an instance of a class, a new object must be created and assigned to a variable. An object will always be assigned when creating a new object unless the object has a constructor defined that throws an exception on error. Classes should be defined before instantiation (and in some cases this is a requirement).

Příklad 19.4. Creating an instance

<?php
$instance
= new SimpleClass();
?>

When assigning an already created instance of a class to a new variable, the new variable will access the same instance as the object that was assigned. This behaviour is the same when passing instances to a function. A copy of an already created object can be made by cloning it.

Příklad 19.5. Object Assignment

<?php
$assigned  
$instance;
$reference  =& $instance;

$instance->var = '$assigned will have this value';

$instance = null; // $instance and $reference become null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>

Výše uvedený příklad vypíše:


NULL
NULL
object(SimpleClass)#1 (1) {
   ["var"]=>
     string(30) "$assigned will have this value"
}

    

extends

A class can inherit methods and members of another class by using the extends keyword in the declaration. It is not possible to extend multiple classes, a class can only inherit one base class.

The inherited methods and members can be overridden, unless the parent class has defined a method as final, by redeclaring them within the same name defined in the parent class. It is possible to access the overridden methods or members by referencing them with parent::

Příklad 19.6. Simple Class Inherintance

<?php
class ExtendClass extends SimpleClass
{
   
// Redefine the parent method
   
function displayVar()
    {
        echo
"Extending class\n";
       
parent::displayVar();
    }
}

$extended = new ExtendClass();
$extended->displayVar();
?>

Výše uvedený příklad vypíše:


Extending class
a default value

    



Autoloading Objects> <Classes and Objects (PHP 5)
Last updated: Sat, 24 Mar 2007
 
add a note add a note User Contributed Notes
The Basics
info at youwanttoremovethisvakantiebaas dot nl
20-Apr-2008 03:40
if you do this
<?php

$x
= new b();

class
b extends a {}

class
a { }

?>
PHP will tell you "class b not found", because you've defined class b before a. However, the error tells you something different.... Got me a little confused :)
david dot schueler at tel-billig dot de
15-Feb-2008 06:16
If you just want to create a new object that extends another object and you want to copy all variables from the father object, you may use this piece of code:
<?php
$father
=& new father();
$father->a_var = "Hello World.";

$son = new son($event);

$son->say_hello();

class
father {
    public
$a_var;
}

class
son extends father {
    public function
__construct($father_class) {
        foreach (
$father_class as $variable=>$value) {
           
$this->$variable = $value;
        }
    }

    public function
say_hello() {
        echo
"Son says: ".$this->a_var;
    }
}
?>
This outputs:

Son says: Hello World.

So you dont have to clone the entire object to get the contents of the variables from the father object.
aaron at thatone dot com
15-Dec-2007 06:46
I was confused at first about object assignment, because it's not quite the same as normal assignment or assignment by reference. But I think I've figured out what's going on.

First, think of variables in PHP as data slots. Each one is a name that points to a data slot that can hold a value that is one of the basic data types: a number, a string, a boolean, etc. When you create a reference, you are making a second name that points at the same data slot. When you assign one variable to another, you are copying the contents of one data slot to another data slot.

Now, the trick is that object instances are not like the basic data types. They cannot be held in the data slots directly. Instead, an object's "handle" goes in the data slot. This is an identifier that points at one particular instance of an obect. So, the object handle, although not directly visible to the programmer, is one of the basic datatypes.

What makes this tricky is that when you take a variable which holds an object handle, and you assign it to another variable, that other variable gets a copy of the same object handle. This means that both variables can change the state of the same object instance. But they are not references, so if one of the variables is assigned a new value, it does not affect the other variable.

<?php
// Assignment of an object
Class Object{
   public
$foo="bar";
};

$objectVar = new Object();
$reference =& $objectVar;
$assignment = $objectVar

//
// $objectVar --->+---------+
//                |(handle1)----+
// $reference --->+---------+   |
//                              |
//                +---------+   |
// $assignment -->|(handle1)----+
//                +---------+   |
//                              |
//                              v
//                  Object(1):foo="bar"
//
?>

$assignment has a different data slot from $objectVar, but its data slot holds a handle to the same object. This makes it behave in some ways like a reference. If you use the variable $objectVar to change the state of the Object instance, those changes also show up under $assignment, because it is pointing at that same Object instance.

<?php
$objectVar
->foo = "qux";
print_r( $objectVar );
print_r( $reference );
print_r( $assignment );

//
// $objectVar --->+---------+
//                |(handle1)----+
// $reference --->+---------+   |
//                              |
//                +---------+   |
// $assignment -->|(handle1)----+
//                +---------+   |
//                              |
//                              v
//                  Object(1):foo="qux"
//
?>

But it is not exactly the same as a reference. If you null out $objectVar, you replace the handle in its data slot with NULL. This means that $reference, which points at the same data slot, will also be NULL. But $assignment, which is a different data slot, will still hold its copy of the handle to the Object instance, so it will not be NULL.

<?php
$objectVar
= null;
print_r($objectVar);
print_r($reference);
print_r($assignment);

//
// $objectVar --->+---------+
//                |  NULL   |
// $reference --->+---------+
//                          
//                +---------+
// $assignment -->|(handle1)----+
//                +---------+   |
//                              |
//                              v
//                  Object(1):foo="qux"
?>
alexandre at dontspamme dot gaigalas dot net
07-Dec-2007 08:44
In theory, it is possible to workaround and do multiple inheritance in PHP5 using magic methods. An example:

<?php

class foo
{
    function
fooMethod($a)
    {
        echo
'fooMethod called with argument: '.$a.'<br>';
    }
}

class
bar
{
    function
barMethod($b)
    {
        echo
'barMethod called with arguments: '.$b.'<br>';
    }   
}

class
multiple
{
    private
$_parents = array();
    function
__construct()
    {
       
$this->_parents[] = new foo;
       
$this->_parents[] = new bar;
    }
    function
__call($m,$a)
    {
        foreach (
$this->_parents as $extended)
        {
            if (
method_exists($extended, $m)) {
                return
call_user_func_array(array($extended,$m),$a);
            }
        }
    }
}

$test = new multiple;

$test->fooMethod('test');
$test->barMethod('me');

?>

This, ovbiously needs some modifications to work with static methods (using Reflection API) and obviously don't work with private methods.
alan at alan-ng dot net
09-Oct-2007 09:41
The following odd behavior happens in php version 5.1.4 (and presumably some other versions) that does not happen in php version 5.2.1 (and possibly other versions > 5.1.4).

<?php

$_SESSION
['instance']=...;

$instance=new SomeClass;

?>

The second line will not only create the $instance object successfully, it will also modify the value of $_SESSION['instance']!

The workaround I arrived at, after trial and error, was to avoid  using object names which match a $_SESSION array key.

This is not intended to be a bug report, since it was apparently fixed by version 5.2.1, so it's just a workaround suggestion.
mep_eisen at web dot de
10-Aug-2007 06:06
referring to steven's post:
****
Perhaps this is because =& statements join the 2 variable names in the symbol table, whereas = statements applied to objects simply create a new independent entry in the symbol table that simply points to the same location as other entries. I don't know for sure - I don't think this behavior is documented in the PHP manual, so perhaps somebody with more knowledge of PHP's internals can clarify what is going on.
****

lets talk about
a =& b;
b = c;

PHP internally marks a to be a reference to b. If You reassign b PHP does not update a. But if you access a once more PHP looks at the current value of b (now containing c).

Both statements (a=b and a=&b) seem to do the same but they don't. However this changed for objects from PHP4 to PHP5. Where PHP4 needed this operator to avoid object cloning, PHP5 does not need it.

It is explained in chapter 21 (References Explained). It's important to understand that a becomes a reference and the following code will not modify b:
a =& b;
a =& c;
Dan Dascalescu
26-Oct-2006 11:00
If E_STRICT is enabled, the first example will generate the following error (and a few others akin to it):

Non-static method A::foo() should not be called statically on line 26

The example should have explicitly declared the methods foo() and bar() as static:

class A                                                                                                                            
{                                                                                                                                  
    static function foo()                                                                                                          
    {
...

Autoloading Objects> <Classes and Objects (PHP 5)
Last updated: Sat, 24 Mar 2007
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites