O que é uma classe em PHP?
3 answers
Em poucas palavras , Uma classe é um modelo para um objecto. E um objeto encapsula Estado conceitualmente relacionado e responsabilidade de algo em sua aplicação e geralmente oferece uma interface de programação com a qual interagir com eles. Isso promove a reutilização de código e melhora a manutenção.
Imagina uma fechadura.
namespace MyExample;
class Lock
{
private $isLocked = false;
public function unlock()
{
$this->isLocked = false;
echo 'You unlocked the Lock';
}
public function lock()
{
$this->isLocked = true;
echo 'You locked the Lock';
}
public function isLocked()
{
return $this->isLocked;
}
}
Ignora o namespace
, private
e declaração agora mesmo.
$isLocked
. Uma vez que só pode ter estes dois estados, eu uso um booleano (true
ou false
) para indicar que estado se aplica. Posso interagir com a fechadura através dos seus métodos. lock
e unlock
, que mudará o estado em conformidade. O método isLocked
dar-me-á o estado actual da fechadura. Agora, quando você cria um objeto (também muitas vezes referido como um A partir deste projecto, encapsulará um estado único, por exemplo.
$aLock = new Lock; // Create object from the class blueprint
$aLock->unlock(); // You unlocked the Lock
$aLock->lock(); // You locked the Lock
Vamos criar outra fechadura, também Encapsulando o seu próprio estado.
$anotherLock = new Lock;
$anotherLock->unlock(); // You unlocked the Lock
Mas como cada objecto / instância encapsula o seu próprio estado, a primeira fechadura fica bloqueada
var_dump( $aLock->isLocked() ); // gives Boolean true
var_dump( $anotherLock->isLocked() ); // gives Boolean false
Agora a reponsabilidade de manter uma fechadura trancada ou destrancada está encaspulada dentro da classe de bloqueio. Você não tem que reconstruí-lo cada vez que você quer trancar alguma coisa e se você quiser mudar como funciona uma fechadura, você pode mudar isso na planta da fechadura em vez de todas as classes ter uma fechadura, por exemplo, uma porta:
class Door
{
private $lock;
private $connectsTo;
public function __construct(Lock $lock)
{
$this->lock = $lock;
$this->connectsTo = 'bedroom';
}
public function open()
{
if($this->lock->isLocked()) {
echo 'Cannot open Door. It is locked.';
} else {
echo 'You opened the Door connecting to: ', $this->connectsTo;
}
}
}
Agora, quando criar um objecto de porta, pode atribuir-lhe um objecto de fechadura. Uma vez que o objeto Tranca lida com toda a responsabilidade de se algo está trancado ou destrancado, a porta não tem que se importar com isso. Na verdade, qualquer objeto que possa usar uma fechadura não teria que se importar, por exemplo um peito
class Chest
{
private $lock;
private $loot;
public function __construct(Lock $lock)
{
$this->lock = $lock;
$this->loot = 'Tons of Pieces of Eight';
}
public function getLoot()
{
if($this->lock->isLocked()) {
echo 'Cannot get Loot. The chest is locked.';
} else {
echo 'You looted the chest and got:', $this->loot;
}
}
}
Como podem ver, a reponsabilidade do peito é diferente do de uma porta. Um peito contém saque, enquanto uma porta separa os quartos. Você pode codificar o estado Bloqueado ou desbloqueado em ambas as classes, mas com uma classe de bloqueio separado, você não tem que e pode reutilizar a fechadura.
$doorLock = new Lock;
$myDoor = new Door($doorLock);
$chestLock = new Lock;
$myChest new Chest($chestLock);
O peito e a porta têm agora as suas fechaduras únicas. Se a fechadura fosse uma fechadura mágica que pudesse existir em vários lugares ao mesmo tempo, como na física quântica, você poderia atribuir a mesma fechadura ao peito e à porta, por exemplo
$quantumLock = new Lock;
$myDoor = new Door($quantumLock);
$myChest new Chest($quantumLock);
E quando tu, a porta e o peito estariam destrancados.
Embora admita que as fechaduras quânticas são um mau exemplo, ilustra o conceito de partilha de objectos em vez de reconstruir o estado e a responsabilidade por todo o lado. Um exemplo do mundo real pode ser um objeto de banco de dados que você passa para classes usando a base de dados.Note que os exemplos acima não mostram como chegar à fechadura de um cofre ou de uma porta para usar os métodos lock()
e unlock()
. Deixo isto como um exercício para o seu exercício (ou outra pessoa para adicionar).
Verifique também quando usar self acima de $isto? para uma explicação mais aprofundada das Classes e objectos e como trabalhar com eles
Para alguns recursos adicionais ver
Classe de construção:
/**
* Constructs a building.
*/
class Building
{
private $name;
private $height;
public function __construct( $name, $height )
{
$this->name = $name;
$this->height = $height;
}
/**
* Returns name of building.
*
* @return string
*/
public function getName( )
{
return $this->name;
}
public function elevatorUp( )
{
// Implementation
}
public function elevatorDown( )
{
// Implementation
}
public function lockDoor( )
{
// Implementation
}
}
Chamando a classe:
// Empire State Building
$empireStateBuilding = new Building( "Empire State Building", 381 );
echo $empireStateBuilding->getName( );
$empireStateBuilding->lockDoor( );
// Burj Khalifa
$burjKhalifa = new Building( "Burj Khalifa", 828 );
echo $burjKhalifa->getName( );
$burjKhalifa->lockDoor( );
Basta copiá-lo, executá-lo no seu localhost e tentar fazer algumas alterações. Em caso de alguma pergunta, pergunta-me. Se você não achar isso útil, basta usar links de posters anteriores, esses são tutoriais bastante sólidos.
Para oferecer uma vista de outro ângulo, se me permite (com base na experiência pessoal). Você precisa sentir "a necessidade de OOP" antes que você possa realmente entender o que é tudo sobre - IMHO, os recursos de aprendizagem devem vir depois disso.
Seria basicamente "necessário" ficar preso em dificuldades estruturais quando se escreve um software relativamente grande escrito em estilo processual (ao contrário de orientada a objetos, desculpe se alguém discorda do termo). Até lá, podia tentar reestruturar o código em objetos para melhor organizá-lo e, naturalmente, saber mais sobre o OOP em detalhes. Mais uma vez, esta é a minha experiência pessoal e me levou a entender mais rápido do que qualquer livro.
Só a minha opinião.