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.php
arquivo deve conter a Contact
classe.
Antes de usar uma classe, você precisa:
- Primeiro, defina a classe em um arquivo.
- Segundo, carregue-o usando a instrução
require
,require_once
,include
ouinclude_once
.
Suponha que você tenha a seguinte estrutura de diretórios de projeto:
.
├── index.php
└── models
└── Contact.php
Linguagem de código: CSS ( css )
O models
diretório possui o Contact.php
arquivo que contém a seguinte Contact
classe:
<?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.php
arquivo e usar a Contact
classe 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_once
instruçã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 models
diretório e o inclui se o arquivo existir. E você pode colocar a load_model()
função no functions.php
arquivo:
.
├── functions.php
├── index.php
└── models
└── Contact.php
Linguagem de código: texto simples ( texto simples )
Para usar a load_model()
função no index.php
arquivo, você pode incluir o functions.php
arquivo 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_model
funçã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.php
arquivo, você não precisa chamar a load_model()
função sempre que usar uma classe no models
diretó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
, autoload2
e autoloader3
sequencialmente para carregar os arquivos de classe.
Para demonstrar isso, vamos criar um novo diretório chamado services
que armazena arquivos de classe de serviço e criar um Email.php
arquivo dentro do services
diretório.
O seguinte define a Email
classe:
<?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.php
Linguagem de código: texto simples ( texto simples )
No functions.php
arquivo, você pode definir uma função que carregue as classes do services
diretó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 Contact
e Email
da 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.