Neste artigo, vamos explorar os fundamentos da programação orientada a objetos em PHP. Começaremos com uma introdução a classes e objetos e discutiremos alguns conceitos avançados, como herança e polimorfismo, na segunda metade deste artigo.
O que é Programação Orientada a Objetos (OOP)?
A programação orientada a objetos, comumente referida como OOP, é uma abordagem que ajuda você a desenvolver aplicativos complexos de uma forma que é facilmente mantida e escalável a longo prazo. No mundo da POO, entidades do mundo real, como Person
, Car
ou Animal
são tratados como objetos. Na programação orientada a objetos, você interage com seu aplicativo usando objetos. Isso contrasta com a programação procedural, onde você interage principalmente com funções e variáveis globais.
Em OOP, existe um conceito de “classe“, que é usado para modelar ou mapear uma entidade do mundo real para um modelo de dados (propriedades) e funcionalidade (métodos). Um “objeto” é uma instância de uma classe e você pode criar várias instâncias da mesma classe. Por exemplo, há uma única Person
classe, mas muitos objetos pessoa podem ser instâncias desta classe—dan
, zainab
, hector
etc
A classe define propriedades. Por exemplo, para a classe Pessoa, podemos ter name
, age
e phoneNumber
. Então, cada objeto pessoa terá seus próprios valores para essas propriedades.
Você também pode definir métodos na classe que permitem manipular os valores das propriedades do objeto e executar operações nos objetos. Por exemplo, você pode definir um save
método que salva as informações do objeto em um banco de dados.
O que é uma classe PHP?
Uma classe é um modelo que representa uma entidade do mundo real e define propriedades e métodos da entidade. Nesta seção, discutiremos a anatomia básica de uma classe PHP típica.
A melhor maneira de entender novos conceitos é com um exemplo. Então vamos dar uma olhada no Employee
classe no trecho a seguir, que representa a entidade de funcionário.
first_name = $first_name; $this->last_name = $last_name; $this->age = $age; } public function getFirstName() { return $this->first_name; } public function getLastName() { return $this->last_name; } public function getAge() { return $this->age; } } ?>
o class Employee
declaração na primeira linha define o Employee
classe. Em seguida, passamos a declarar as propriedades, o construtor e os outros métodos de classe.
Propriedades de classe em PHP
Você pode pensar nas propriedades de classe como variáveis usadas para armazenar informações sobre o objeto. No exemplo acima, definimos três propriedades—first_name
, last_name
e age
. Na maioria dos casos, as propriedades de classe são acessadas por meio de objetos instanciados.
Essas propriedades são private
, o que significa que eles só podem ser acessados de dentro da classe. Este é o nível de acesso mais seguro para propriedades. Discutiremos os diferentes níveis de acesso para métodos e propriedades de classe posteriormente neste artigo.
Construtores para classes PHP
Um construtor é um método de classe especial que é chamado automaticamente quando você instancia um objeto. Veremos como instanciar objetos nas próximas seções, mas por enquanto você só precisa saber que um construtor é usado para inicializar as propriedades do objeto quando o objeto está sendo criado.
Você pode definir um construtor definindo o __construct
método.
Métodos para classes PHP
Podemos pensar em métodos de classe como funções que executam ações específicas associadas a objetos. Na maioria dos casos, eles são usados para acessar e manipular propriedades de objetos e executar operações relacionadas.
No exemplo acima, definimos o getLastName
método, que retorna o sobrenome associado ao objeto.
Esta é uma breve introdução à estrutura de classes em PHP. Na próxima seção, veremos como instanciar objetos do Employee
classe.
O que é um objeto em PHP?
Na seção anterior, discutimos a estrutura básica de uma classe em PHP. Agora, quando você quiser usar uma classe, você precisa instanciá-la e o resultado final é um objeto. Portanto, podemos pensar em uma classe como um projeto, e um objeto é uma coisa real com a qual você pode trabalhar.
No contexto do Employee
classe que acabamos de criar na seção anterior, vamos ver como instanciar um objeto dessa classe.
getFirstName(); // print 'Bob' echo $objEmployee->getLastName(); // prints 'Smith' echo $objEmployee->getAge(); // prints '30' ?>
Você precisa usar o new
palavra-chave quando quiser instanciar um objeto de qualquer classe junto com seu nome de classe e obterá uma nova instância de objeto dessa classe.
Se uma classe definiu o __construct
método e requer argumentos, você precisa passar esses argumentos ao instanciar um objeto. No nosso caso, o Employee
construtor de classe requer três argumentos e, portanto, os passamos quando criamos o $objEmployee
objeto. Como discutimos anteriormente, o __construct
O método é chamado automaticamente quando o objeto é instanciado.
Em seguida, chamamos os métodos de classe no $objEmployee
object para imprimir as informações que foram inicializadas durante a criação do objeto. Claro, você pode criar vários objetos da mesma classe, conforme mostrado no trecho a seguir.
getFirstName(); // prints 'Bob' echo $objEmployeeOne->getLastName(); // prints 'Smith' echo $objEmployeeOne->getAge(); // prints '30' $objEmployeeTwo = new Employee('John', 'Smith', 34); echo $objEmployeeTwo->getFirstName(); // prints 'John' echo $objEmployeeTwo->getLastName(); // prints 'Smith' echo $objEmployeeTwo->getAge(); // prints '34' ?>
A imagem a seguir é uma representação gráfica da classe Employee e algumas de suas instâncias.
Simplificando, uma classe é um projeto que você pode usar para criar objetos estruturados.
Encapsulamento
Na seção anterior, discutimos como instanciar objetos do Employee
classe. É interessante notar que o $objEmployee
O próprio objeto agrupa propriedades e métodos da classe. Em outras palavras, ele oculta esses detalhes do restante do programa. No mundo da OOP, isso é chamado de encapsulamento de dados.
O encapsulamento é um aspecto importante da OOP que permite restringir o acesso a certas propriedades ou métodos do objeto. E isso nos leva a outro tópico para discussão: níveis de acesso.
Níveis de acesso
Ao definir uma propriedade ou um método em uma classe, você pode declará-la para ter um desses três níveis de acesso—public
, private
ou protected
.
Acesso público
Quando você declara uma propriedade ou um método como público, ele pode ser acessado de qualquer lugar fora da classe. O valor de uma propriedade pública pode ser modificado de qualquer lugar em seu código.
Vejamos um exemplo para entender o nível de acesso público.
name; } } $person = new Person(); $person->name="Bob Smith"; echo $person->getName(); // prints 'Bob Smith' ?>
Como você pode ver no exemplo acima, declaramos o name
propriedade seja pública. Portanto, você pode configurá-lo de qualquer lugar fora da classe, como fizemos aqui.
Acesso Privado
Quando você declara uma propriedade ou um método como private
, ele só pode ser acessado de dentro da classe. Isso significa que você precisa definir os métodos getter e setter para obter e definir o valor dessa propriedade.
Novamente, vamos revisar o exemplo anterior para entender o nível de acesso privado.
name; } public function setName($name) { $this->name = $name; } } $person = new Person(); $person->name="Bob Smith"; // Throws an error $person->setName('Bob Smith'); echo $person->getName(); // prints 'Bob Smith' ?>
Se você tentar acessar uma propriedade privada de fora da classe, isso lançará o erro fatal Cannot access private property Person::$name
. Assim, você precisa definir o valor da propriedade private usando o método setter, como fizemos usando o método setName
método.
Existem boas razões pelas quais você pode querer tornar uma propriedade privada. Por exemplo, talvez alguma ação deva ser executada (atualizar um banco de dados, digamos, ou renderizar novamente um modelo) se essa propriedade for alterada. Nesse caso, você pode definir um método setter e manipular qualquer lógica especial quando a propriedade for alterada.
Acesso protegido
Finalmente, quando você declara uma propriedade ou um método como protected
, ele pode ser acessado pela mesma classe que o definiu e pelas classes que herdam a classe em questão. Discutiremos a herança na próxima seção, então voltaremos ao nível de acesso protegido um pouco mais tarde.
Herança
A herança é um aspecto importante do paradigma de programação orientada a objetos que permite herdar propriedades e métodos de outras classes estendendo-os. A classe que está sendo herdada é chamada de classe paie a classe que herda a outra classe é chamada de classe infantil. Quando você instancia um objeto da classe filha, ele também herda as propriedades e os métodos da classe pai.
Vamos dar uma olhada na captura de tela a seguir para entender o conceito de herança.
No exemplo acima, o Person
class é a classe pai, e o Employee
A classe estende ou herda a classe Person e, portanto, é chamada de classe filha.
Vamos tentar passar por um exemplo do mundo real para entender como isso funciona.
name; } public function setName($name) { $this->name = $name; } private function callToPrivateNameAndAge() { return "{$this->name} is {$this->age} years old."; } protected function callToProtectedNameAndAge() { return "{$this->name} is {$this->age} years old."; } } class Employee extends Person { private $designation; private $salary; public function getAge() { return $this->age; } public function setAge($age) { $this->age = $age; } public function getDesignation() { return $this->designation; } public function setDesignation($designation) { $this->designation = $designation; } public function getSalary() { return $this->salary; } public function setSalary($salary) { $this->salary = $salary; } public function getNameAndAge() { return $this->callToProtectedNameAndAge(); } } $employee = new Employee(); $employee->setName('Bob Smith'); $employee->setAge(30); $employee->setDesignation('Software Engineer'); $employee->setSalary('30K'); echo $employee->getName(); // prints 'Bob Smith' echo $employee->getAge(); // prints '30' echo $employee->getDesignation(); // prints 'Software Engineer' echo $employee->getSalary(); // prints '30K' echo $employee->getNameAndAge(); // prints 'Bob Smith is 30 years old.' echo $employee->callToPrivateNameAndAge(); // produces 'Fatal Error' ?>
O importante a observar aqui é que o Employee
classe usou o extends
palavra-chave para herdar o Person
classe. Agora o Employee
classe pode acessar todas as propriedades e métodos do Person
classes que são declaradas como públicas ou protegidas. (Ele não pode acessar membros declarados como privados.)
No exemplo acima, o $employee
objeto pode acessar getName
e setName
métodos definidos no Person
classe desde que eles são declarados como públicos.
Em seguida, acessamos o callToProtectedNameAndAge
método usando o getNameAndAge
método definido no Employee
classe, uma vez que é declarado como protegido. finalmente, o $employee
objeto não pode acessar o callToPrivateNameAndAge
método do Person
classe desde que é declarado como privado.
Por outro lado, você pode usar o $employee
objeto para definir o age
propriedade do Person
aula, como fizemos no setAge
método que é definido no Employee
classe, desde o age
propriedade é declarada como protegida.
Essa foi uma breve introdução à herança. Ele ajuda a reduzir a duplicação de código e, portanto, incentiva a reutilização de código.
Polimorfismo
O polimorfismo é outro conceito importante no mundo da programação orientada a objetos, que se refere à capacidade de processar objetos de maneira diferente com base em seus tipos de dados.
Por exemplo, no contexto de herança, se a classe filha quiser alterar o comportamento do método da classe pai, ela poderá substituir esse método. Isso é chamado de substituição de método. Vamos examinar rapidamente um exemplo do mundo real para entender o conceito de substituição de método.
%s", $message); } } class BoldMessage extends Message { public function formatMessage($message) { return printf("%s", $message); } } $message = new Message(); $message->formatMessage('Hello World'); // prints 'Hello World' $message = new BoldMessage(); $message->formatMessage('Hello World'); // prints 'Hello World' ?>
Como você pode ver, mudamos o comportamento do formatMessage
método substituindo-o no BoldMessage
classe. O importante é que uma mensagem seja formatada de forma diferente com base no tipo de objeto, seja uma instância da classe pai ou da classe filha.
(Algumas linguagens orientadas a objetos também têm um tipo de sobrecarga de método que permite definir vários métodos de classe com o mesmo nome, mas um número diferente de argumentos. Isso não é suportado diretamente no PHP, mas há algumas soluções alternativas para obter resultados semelhantes funcionalidade.)
Conclusão
A programação orientada a objetos é um assunto vasto e nós apenas arranhamos a superfície de sua complexidade. Espero que este tutorial tenha ajudado você a começar com os fundamentos da OOP e que isso o motive a continuar e aprender tópicos mais avançados de OOP.
A programação orientada a objetos é um aspecto importante no desenvolvimento de aplicativos, independentemente da tecnologia com a qual você está trabalhando. Hoje, no contexto do PHP, discutimos alguns conceitos básicos de OOP e também aproveitamos a oportunidade para apresentar alguns exemplos do mundo real.
Sinta-se à vontade para postar suas dúvidas usando o feed abaixo!