Métodos Mágicos PHP

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 ) : voidLinguagem 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 HTMLElementclasse 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 $attributearray.
  • Quarto, defina o html()método que retorna a representação HTML do elemento.

O seguinte usa a HTMLElementclasse 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 à $attributepropriedade.

__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 ) : mixedLinguagem de código:  PHP  ( php )

O seguinte adiciona o __get()método à HTMLElementclasse:

<?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 $attributesde retornar o resultado.

O seguinte cria um novo articleelemento, 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; // mainLinguagem 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *