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 e Objetos (PHP 5)
Last updated: Fri, 18 Jul 2008

view this page in

O Básico

Classe

Toda definição de classe começa com a palavra-chave class, seguido por um nome da classe, que pode ser qualquer nome que não seja uma palavra reservada no PHP. seguido por um par de chaves, que contém a definição dos membros e métodos da classe. Uma pseudo variável, $this, está disponível quando um método é chamado dentro de um contexto de objeto. $this é uma referência para o objeto chamador do método (normalmente o objeto ao qual o método pertence, mas pode ser outro objeto, se o método é chamado statically do contexto de um objeto secundário). Isso é ilustrado no exemplo a seguir:

Exemplo #1 Variável $this em linguagens com orientação à objetos

<?php
class A
{
    function 
foo()
    {
        if (isset(
$this)) {
            echo 
'$this está definida (';
            echo 
get_class($this);
            echo 
")\n";
        } else {
            echo 
"\$this não está definida.\n";
        }
    }
}

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

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

O exemplo acima irá imprimir:

$this está definida (a)
$this não está definida.
$this está definida (b)
$this não está definida.

Exemplo #2 Definição de SimpleClass

<?php
class SimpleClass
{
    
// declaração de membro
    
public $var 'um valor padrão';

    
// declaração de método
    
public function displayVar() {
        echo 
$this->var;
    }
}
?>

O valor padrão deve ser uma expressão constante, não (por exemplo) uma variável, um membro da class ou uma chamada de função.

Exemplo #3 Valor padrão de membros da classe

<?php
class SimpleClass
{
    
// declarações de membro inválidas
    
public $var1 'olá '.'mundo';
    public 
$var2 = <<<EOD
olá mundo
EOD;
    public 
$var3 1+2;
    public 
$var4 self::myStaticMethod();
    public 
$var5 $myVar;

    
// declarações de membro válidas
    
public $var6 myConstant;
    public 
$var7 self::classConstant;
    public 
$var8 = array(truefalse);


}
?>

Nota: Existem algumas funções legais para lidar com classes e objetos. É bom dar uma olhada nas funções de Classe/Objeto.

Diferente de heredocs, nowdocs pode ser usado no contexto de dado estático.

Exemplo #4 Exemplo com dado estático

<?php
class foo {
    
// A partir do PHP 5.3.0
    
public $bar = <<<'EOT'
bar
EOT
;
}
?>

Nota: Suporte a Nowdoc foi adicionado no PHP 5.3.0.

new

Para criar uma instância de um objeto, um novo objeto deve ser criado e atribuído à uma variável. Um objeto sempre será atribuído quando for criado um novo objeto, a não ser que o objeto tenha um construtor definido que dispare uma exceção por um erro. Classes devem ser definidas antes de serem instanciadas (e em alguns casos isso é um requerimento).

Exemplo #5 Criando uma instância

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

No contexto da classe, é possível criar um novo objeto por new self and new parent.

Quando atribuír um instância já criada de um objeto à uma variável nova, essa acessarpa a mesma instância do objeto que foi atribuído. Esse comportamento se mantem quando passando instâncias à uma função. Uma nova instância de um objeto já criado pode ser feita clonando o mesmo.

Exemplo #6 Atribuíção de Objetos

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

$instance->var '$assigned terá esse valor';

$instance null// $instance e $reference tornam-se nulos

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

O exemplo acima irá imprimir:

NULL
NULL
object(SimpleClass)#1 (1) {
   ["var"]=>
     string(30) "$assigned terá esse valor"
}

extends

Uma classe pode herdar métodos e membros de outra classe usando a palavra-chave extends na sua declaração. Não é possível herdar classes múltiplas, uma classe só pode herdar uma classe base.

Os métodos e membros herdados podem ser sobrescritos, a não ser que a classe pai definiu um método como final, redeclarando eles com o mesmo nome definido na classe pai. É possível acessar os sobreescritos métodos ou membros estáticos referenciado-os com parent::

Exemplo #7 Herança Simples

<?php
class ExtendClass extends SimpleClass
{
    
// Redefine o método pai
    
function displayVar()
    {
        echo 
"Classe Herdeira\n";
        
parent::displayVar();
    }
}

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

O exemplo acima irá imprimir:

Classe Herdeira
um valor padrão


Autoloading Objects> <Classes e Objetos (PHP 5)
Last updated: Fri, 18 Jul 2008
 
add a note add a note User Contributed Notes
O Básico
ashraf dot samhouri at hotmail dot com
24-May-2008 03:35
@info -- 20-April

This is because you requested class "b" before defining it, not because you defined class "b" before "a". It doesn't make a difference which class you define first.
info at youwanttoremovethisvakantiebaas dot nl
21-Apr-2008 12: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 03: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
16-Dec-2007 03: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"
?>
alan at alan-ng dot net
10-Oct-2007 06: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 03: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
27-Oct-2006 08: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 e Objetos (PHP 5)
Last updated: Fri, 18 Jul 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites