Resumo : neste tutorial, você aprenderá sobre os métodos mágicos do PHP que substituem as ações padrão quando o objeto executa as ações.
Introdução aos métodos mágicos do PHP
Os métodos mágicos do PHP são métodos especiais em uma classe . Os métodos mágicos substituem as ações padrão quando o objeto executa as ações.
Por convenção, os nomes dos métodos mágicos começam com um sublinhado duplo ( __
). E o PHP reserva os métodos cujos nomes começam com um sublinhado duplo ( __
) para métodos mágicos.
Até agora, você aprendeu que o construtor e o destruidor usam os métodos __construct()
e __destruct()
. Na verdade, o construtor e o destruidor também são métodos mágicos.
O __construct()
método é invocado automaticamente quando um objeto é criado e é __destruct()
chamado quando o objeto é excluído.
Além dos métodos __contruct()
e __destruct()
, o PHP também possui os seguintes métodos mágicos:
Método Mágico | Descrição |
---|---|
__chamar() | é acionado ao invocar um método de instância inacessível |
__callStatic() | é acionado ao invocar um método estático inacessível |
__pegar() | é invocado ao ler o valor de uma propriedade inexistente ou inacessível |
__definir() | é invocado ao escrever um valor em uma propriedade inexistente ou inacessível |
__isset() | é acionado chamando isset() ou vazio() em uma propriedade inexistente ou inacessível |
__unset() | é invocado quando unset() é usado em uma propriedade inexistente ou inacessível. |
__dormir() | O __sleep() confirma os dados pendentes |
__acordar() | é invocado quando unserialize() é executado para reconstruir qualquer recurso que um objeto possa ter. |
__serialize() | O serialize() chama __serialize(), se disponível, e constrói e retorna uma matriz associativa de pares chave/valor que representam a forma serializada do objeto. |
__unserialize() | O unserialize() chama __unserialize(), se disponível, e restaura as propriedades do objeto do array retornado pelo método __unserialize(). |
__para sequenciar() | é invocado quando um objeto de uma classe é tratado como uma string. |
__invocar() | é invocado quando um objeto é chamado como uma função |
__set_state() | é chamado para uma classe exportada por var_export() |
__clone() | é chamado assim que a clonagem for concluída |
__debugInfo() | é chamado ao var_dump() despejar um objeto para obter as propriedades que devem ser mostradas. |
Este tutorial se concentrará nos métodos __set()
e __get()
.
Método PHP __set()
Quando você tenta escrever em uma propriedade inexistente ou inacessível, o PHP chama o __set()
método automaticamente. O seguinte mostra a sintaxe do __set()
método:
public __set ( string $name , mixed $value ) : void
Linguagem de código: PHP ( php )
O __set()
método aceita o nome e o valor da propriedade na qual você grava. O exemplo a seguir ilustra como usar o __set()
método:
<?php
class HtmlElement
{
private $attributes = [];
private $tag;
public function __construct($tag)
{
$this->tag = $tag;
}
public function __set($name, $value)
{
$this->attributes[$name] = $value;
}
public function html($innerHTML = '')
{
$html = "<{$this->tag}";
foreach ($this->attributes as $key => $value) {
$html .= ' ' . $key . '="' . $value . '"';
}
$html .= '>';
$html .= $innerHTML;
$html .= "</$this->tag>";
return $html;
}
}
Linguagem de código: HTML, XML ( xml )
Como funciona.
- Primeiro, defina a
HTMLElement
classe que possui apenas uma propriedade$attributes
. Ele conterá todos os atributos do elemento HTML, por exemplo, id e classe. - Segundo, inicialize o construtor com um nome de tag. O nome da tag pode ser qualquer string, como div, artigo, principal e seção.
- Terceiro, implemente o
__set()
método que adiciona qualquer propriedade ao$attribute
array. - Quarto, defina o
html()
método que retorna a representação HTML do elemento.
O seguinte usa a HTMLElement
classe e cria um novo elemento div:
<?php
require 'HTMLElement.php';
$div = new HtmlElement('div');
$div->id = 'page';
$div->class = 'light';
echo $div->html('Hello');
Linguagem de código: HTML, XML ( xml )
Saída:
<div id="page" class="light">Hello</div>
Linguagem de código: HTML, XML ( xml )
O código a seguir tenta gravar na propriedade inexistente:
$div->id = 'page';
$div->class = 'light';
Linguagem de código: PHP ( php )
PHP chama o __set()
método implicitamente e adiciona essas propriedades à $attribute
propriedade.
__get()
Método PHP
Quando você tenta acessar uma propriedade que não existe ou uma propriedade que está inacessível, por exemplo, propriedade privada ou protegida, o PHP chama automaticamente o __get()
método.
O __get()
método aceita um argumento que é o nome da propriedade que você deseja acessar:
public __get ( string $name ) : mixed
Linguagem de código: PHP ( php )
O seguinte adiciona o __get()
método à HTMLElement
classe:
<?php
class HtmlElement
{
private $attributes = [];
private $tag;
public function __construct($tag)
{
$this->tag = $tag;
}
public function __set($name, $value)
{
$this->attributes[$name] = $value;
}
public function __get($name)
{
if (array_key_exists($name, $this->attributes)) {
return $this->attributes[$name];
}
}
public function html($innerHTML = '')
{
$html = "<{$this->tag}";
foreach ($this->attributes as $key => $value) {
$html .= ' ' . $key . '="' . $value . '"';
}
$html .= '>';
$html .= $innerHTML;
$html .= "</$this->tag>";
return $html;
}
}
Linguagem de código: HTML, XML ( xml )
O __get()
método verifica se a propriedade solicitada existe antes $attributes
de retornar o resultado.
O seguinte cria um novo article
elemento, define os atributos id e class e, em seguida, mostra o valor desses atributos:
<?php
require 'HTMLElement.php';
$article = new HtmlElement('article');
$article->id = 'main';
$article->class = 'light';
// show the attributes
echo $article->class; // light
echo $article->id; // main
Linguagem de código: HTML, XML ( xml )
Resumo
- Os métodos PHP Magic começam com sublinhados duplos (__).
- O PHP chama o
__get()
método automaticamente quando você acessa uma propriedade inexistente ou inacessível. - O PHP chama o
__set()
método automaticamente quando você atribui um valor a uma propriedade inexistente ou inacessível.