Arquivos de classe de carregamento automático PHP

Resumo : neste tutorial, você aprenderá como organizar seus arquivos de classe e carregá-los automaticamente usando  spl_autoload_register()a função PHP.

É uma boa prática manter cada classe PHP em um arquivo separado. Além disso, o nome da classe deve ser igual ao nome do arquivo. Por exemplo, o Contact.phparquivo deve conter a Contactclasse.

Antes de usar uma classe, você precisa:

  • Primeiro, defina a classe em um arquivo.
  • Segundo, carregue-o usando a instrução require, require_once, includeou include_once.

Suponha que você tenha a seguinte estrutura de diretórios de projeto:

.
├── index.php
└── models
    └── Contact.phpLinguagem de código:  CSS  ( css )

O modelsdiretório possui o Contact.phparquivo que contém a seguinte Contactclasse:

<?php

class Contact
{
	private $email;

	public function __construct(string $email)
	{
		$this->email = $email;
	}

	public function getEmail()
	{
		return $this->email;
	}
}
Linguagem de código:  HTML, XML  ( xml )

No arquivo index.php, você pode carregar o models/Contact.phparquivo e usar a Contactclasse da seguinte forma:

<?php

require_once 'models/Contact.php';
$contact = new Contact('[email protected]');
Linguagem de código:  HTML, XML  ( xml )

Esta solução funciona bem se você tiver um pequeno número de arquivos. Quando o número de arquivos aumenta, a require_onceinstrução não é bem dimensionada.

Para resolvê-lo, você pode definir uma função que receba um nome de classe como argumento e inclua o arquivo que contém a definição da classe. Por exemplo:

<?php

function load_model($class_name)
{
	$path_to_file = 'models/' . $class_name . '.php';

	if (file_exists($path_to_file)) {
		require $path_to_file;
	}
}Linguagem de código:  HTML, XML  ( xml )

A load_class()função procura o arquivo de classe no modelsdiretório e o inclui se o arquivo existir. E você pode colocar a load_model()função no functions.phparquivo:

.
├── functions.php
├── index.php
└── models
    └── Contact.phpLinguagem de código:  texto simples  ( texto simples )

Para usar a load_model()função no index.phparquivo, você pode incluir o functions.phparquivo e chamar a load_model()função:

<?php

require_once 'functions.php';

load_model('Person');

$person = new Person();Linguagem de código:  HTML, XML  ( xml )

Autoloader com função spl_autoload_register()

O PHP 5.1.2 introduziu a spl_autoload_register()função que carrega automaticamente um arquivo de classe sempre que você usa uma classe que ainda não foi carregada.

O PHP 7.2.0 descontinuou a __autoload()função mágica e recomendou usá-la spl_autoload_register()em seu lugar.

Quando você usa uma classe que não foi carregada, o PHP irá procurar automaticamente pela spl_autoload_register()chamada de função.

A spl_autoload_register()função aceita uma função de retorno de chamada e a chama quando você tenta criar uma classe que não foi carregada.

Para usar a spl_autoload_register()função, você pode passar a load_modelfunção para ela da seguinte maneira:

<?php

function load_model($class_name)
{
	$path_to_file = 'models/' . $class_name . '.php';

	if (file_exists($path_to_file)) {
		require $path_to_file;
	}
}


spl_autoload_register('load_model');
Linguagem de código:  HTML, XML  ( xml )

E a partir do index.phparquivo, você não precisa chamar a load_model()função sempre que usar uma classe no modelsdiretório:

<?php

require 'functions.php';

$contact = new Contact('[email protected]');Linguagem de código:  HTML, XML  ( xml )

Múltiplas funções de carregamento automático

A spl_autoload_register()função permite que você use várias funções de carregamento automático. A spl_autoload_register()função criará uma fila de funções de carregamento automático e executará cada uma delas na ordem em que são definidas.

Por exemplo:

<?php

spl_autoload_register('autoloader1');
spl_autoload_register('autoloader2');
spl_autoload_register('autoloader3');Linguagem de código:  HTML, XML  ( xml )

Neste exemplo, o PHP executará autoloader1, autoload2e autoloader3sequencialmente para carregar os arquivos de classe.

Para demonstrar isso, vamos criar um novo diretório chamado servicesque armazena arquivos de classe de serviço e criar um Email.phparquivo dentro do servicesdiretório.

O seguinte define a Emailclasse:

<?php

class Email
{
	public static function send($contact)
	{
		return 'Sending an email to ' . $contact->getEmail();
	}
}Linguagem de código:  HTML, XML  ( xml )

O diretório do projeto agora se parece com isto:

.
├── functions.php
├── index.php
├── models
│   └── Contact.php
└── services
    └── Email.phpLinguagem de código:  texto simples  ( texto simples )

No functions.phparquivo, você pode definir uma função que carregue as classes do servicesdiretório e passe o nome da função para a spl_autoload_register()função assim:

<?php

function load_model($class_name)
{
	$path_to_file = 'models/' . $class_name . '.php';

	if (file_exists($path_to_file)) {
		require $path_to_file;
	}
}

function load_service($service_name)
{
	$path_to_file = 'services/' . $service_name . '.php';

	if (file_exists($path_to_file)) {
		require $path_to_file;
	}
}

spl_autoload_register('load_model');
spl_autoload_register('load_service');Linguagem de código:  HTML, XML  ( xml )

No index.php, você pode usar as classes Contacte Emailda seguinte maneira:

<?php

require 'functions.php';

$contact = new Contact('[email protected]');

echo Email::send($contact);Linguagem de código:  HTML, XML  ( xml )

Saída:

Sending an email to [email protected]Linguagem de código:  texto simples  ( texto simples )

Assim como as classes, você também pode carregar as interfaces e características usando a mesma função de carregamento automático.

Resumo

  • Uma função de carregamento automático carrega uma classe, uma interface ou uma característica de um arquivo PHP.
  • Use a spl_autoload_register()função para carregar automaticamente as classes, interfaces e características.

Deixe um comentário

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