Orientação a Objetos com PHP

by luizmagao@gmail.com

<?php
class SimpleClass
{
    // declaração de propriedade
    public $var = 'um valor padrão';

    // declaração de método
    public function displayVar() {
        echo $this->var;
    }
}
{
	"name": "luizmagao/phpoo-101",
    "require-dev": {
    	"symfony/var-dumper": "7.1"
    },
    "authors": [
    	{
        	"name": "Luiz Lins",
            "email": "luizmagao@gmail.com"
        }
    ],
    "require": {}
}
<?php

require "../vendor/autoload.php";

class Person
{
}

$person = new Person();

dd($person);
<?php

require "../vendor/autoload.php";

class Person
{
	public string $name;
    public int $age;
    public string $gender;
    
    public function walk(): string
    {
    	return "I am walking";
    }
    
    public function run(): string
    {
    	return "I am run";
    }
}

$person = new Person();

dd($person->run());
<?php

require "../vendor/autoload.php";

class Person
{
	public string $name;
    public int $age;
    public string $gender;
    
    public function walk(): string
    {
    	return $this->name . " is walking";
    }
    
    public function run(): string
    {
    	return "I am run";
    }
}

$person = new Person();

$person->name = "Luiz Lins";

dd($person);
<?php

require "../vendor/autoload.php";

class Person
{
	public string $name;
    public int $age;
    public string $gender;
    
    public function walk(): string
    {
    	return $this->name . " is walking";
    }
    
    public function run(): string
    {
    	return "I am run";
    }
    
    public function data(): array
    {
    	return [
        	'name' => $this->name,
            'age' => $this->age,
            'gender' => $this->gender
        ];
    }
}

$person = new Person();

$person->name = "Luiz Lins";
$person->age = 42;
$person->gender = "Masculino";

dd($person->data());
<?php

require "../vendor/autoload.php";

class Person
{
	public string $name;
    public int $age;
    public string $gender;
    
    public function walk(): string
    {
    	return $this->name . " is walking";
    }
    
    public function run(string $name): string
    {
    	return "I am run";
    }
    
    public function data(): array
    {
    	return [
        	'name' => $this->name,
            'age' => $this->age,
            'gender' => $this->gender
        ];
    }
}

$person = new Person();

dd($person->run('teste'));

methods
magics

<?php

require "../vendor/autoload.php";

class Person
{
	public string $name;
    public int $age;
    public string $gender;
    
    public function __construct()
    {
    	dd('I am a constructor');
    }
    
    public function walk(): string
    {
    	return $this->name . " is walking";
    }
    
    public function run(string $name): string
    {
    	return "I am run";
    }
    
    public function data(): array
    {
    	return [
        	'name' => $this->name,
            'age' => $this->age,
            'gender' => $this->gender
        ];
    }
}

$person = new Person();
<?php

require "../vendor/autoload.php";

class Person
{
	public string $name;
    public int $age;
    public string $gender;
    
    public function __construct(string $name, int $age, string $gender)
    {
    	$this->name = $name;
        $this->age = $age;
        $this->gender = $gender;
    }
    
    public function walk(): string
    {
    	return $this->name . " is walking";
    }
    
    public function run(string $name): string
    {
    	return "I am run";
    }
    
    public function data(): array
    {
    	return [
        	'name' => $this->name,
            'age' => $this->age,
            'gender' => $this->gender
        ];
    }
}

$person = new Person('Luiz Lins', 42, 'Masculino');

Existe outra forma mais prática?

<?php

require "../vendor/autoload.php";

class Person
{
	//public string $name;
    //public int $age;
    //public string $gender;
    
    public function __construct(public string $name, public int $age, public string $gender)
    {
    	//$this->name = $name;
        //$this->age = $age;
        //$this->gender = $gender;
    }
    
    public function walk(): string
    {
    	return $this->name . " is walking";
    }
    
    public function run(string $name): string
    {
    	return "I am run";
    }
    
    public function data(): array
    {
    	return [
        	'name' => $this->name,
            'age' => $this->age,
            'gender' => $this->gender
        ];
    }
}

$person = new Person('Luiz Lins', 42, 'Masculino');
<?php

require './vendor/autoload.php';

class HomeController
{

	private function view(string $view): string
    {
    	return $view;
    }
    
    public function index(): string
    {
    	reurn $this->view('home');
    }

}

$controller = new HomeController();
dd($controller->view());
dd($controller->index());

Se existisse mais controllers?

<?php

require './vendor/autoload.php';

class HomeController
{

	private function view(string $view): string
    {
    	return $view;
    }
    
    public function index(): string
    {
    	reurn $this->view('home');
    }

}

class LoginController
{

	private function view(string $view): string
    {
    	return $view;
    }
    
    public function index(): string
    {
    	reurn $this->view('login');
    }

}

$controller = new LoginController();
dd($controller->view());
dd($controller->index());

Agora vamos de herança

<?php

require './vendor/autoload.php';

class HomeController extends BaseController
{
    
    public function index(): string
    {
    	reurn $this->view('home');
    }

}

class LoginController extends BaseController
{

    public function index(): string
    {
    	reurn $this->view('login');
    }

}

class BaseController
{

	protected function view(string $view): string
    {
    	return $view;
    }
    
}

$controller = new LoginController();
dd($controller->view());
dd($controller->index());

 

abstração

<?php

abstract class ClasseAbstrata
{
    // Força a classe que estende ClasseAbstrata a definir esse método
    abstract protected function pegarValor();
    abstract protected function valorComPrefixo($prefixo);

    // Método comum
    public function imprimir()
    {
        print $this->pegarValor();
    }
}

class ClasseConcreta1 extends ClasseAbstrata
{
    protected function pegarValor()
    {
        return "ClasseConcreta1";
    }

    public function valorComPrefixo($prefixo)
    {
        return "{$prefixo}ClasseConcreta1";
    }
}

class ClasseConcreta2 extends ClasseAbstrata
{
    protected function pegarValor()
    {
        return "ClasseConcreta2";
    }

    public function valorComPrefixo($prefixo)
    {
        return "{$prefixo}ClasseConcreta2";
    }
}

$classe1 = new ClasseConcreta1();
$classe1->imprimir();
echo $classe1->valorComPrefixo('FOO_'), "\n";

$classe2 = new ClasseConcreta2();
$classe2->imprimir();
echo $classe2->valorComPrefixo('FOO_'), "\n";
<?php

require './vendor/autoload.php';

abstract class Logger
{
    abstract public function log($message): string;
}

class FileLog extends Logger
{
    protected function log($message): string
    {
    	return 'FileLog: ' . $message;
    }
}

class DatabaseLog extends Logger
{
    protected function log($message): string
    {
    	return 'DatabaseLog: ' . $message;
    }
}

$logger = new FileLog;

dd($logger->log('Hello World'));

Corrigir esse herança com abstração

<?php

require './vendor/autoload.php';

class HomeController extends BaseController
{
    
    public function index(): string
    {
    	reurn $this->view('home');
    }

}

class LoginController extends BaseController
{

    public function index(): string
    {
    	reurn $this->view('login');
    }

}

class BaseController
{

	protected function view(string $view): string
    {
    	return $view;
    }
    
}

$controller = new LoginController();
dd($controller->view());
dd($controller->index());
<?php

require './vendor/autoload.php';

class HomeController extends BaseController
{
    
    public function index(): string
    {
    	reurn $this->view('home');
    }

}

class LoginController extends BaseController
{

    public function index(): string
    {
    	reurn $this->view('login');
    }

}

abstract class BaseController
{

	protected function view(string $view): string
    {
    	return $view;
    }
    
    abstract public function index(): string;
}

$controller = new LoginController();
dd($controller->view());
dd($controller->index());

interfaces de objetos

<?php

interface Template
{
	public function setVariable($name, $var);
    public function getHtml($template);
}

class WorkingTemplate implements Template
{
	private $var = [];
    
    public function setVariable($name, $var)
    {
    	$this->vars[$name] = $var;
    }
    
    public function getHtml($template)
    {
    	foreach($this->vars as $name => $value) {
        	$template = str_replace('{' . $name . '}', $value, $template);
        }
        
        return $template;
    }
}

class BadTemplate implements Template
{
	private $var = [];
    
    public function setVariable($name, $var)
    {
    	$this->vars[$name] = $var;
    }
}
<?php

require './vendor/autoload.php';

class MysqlDatabase {}

class SqLiteDatabase {}

class PsgDatabase {}

Class Database {
	public function connect(sting $type)
    {
    	if($type === 'mysql') {
        	return new MysqlDatabase();
        } elseif($type === 'sqlite') {
        	return new SqLiteDatabase();
        } elseif($type === 'psg') {
        	return new PsgDatabase();
        }
    }
}

$database = new Database();
$connect = $database->connect('mysql');
dd($connect);

Tenho que mudar o IF toda vida pra uma nova classe?

<?php

require './vendor/autoload.php';

interface DatabaseInterface
{
	public function connect();
}

class MysqlDatabase implements DatabaseInterface 
{
	public function connect()
    {
    	return 'Connect to MySQL';
    }
} 

class SqLiteDatabase implements DatabaseInterface 
{
	public function connect()
    {
    	return 'Connect to SqLiteDatabase';
    }
} 

class PsgDatabase implements DatabaseInterface 
{
	public function connect()
    {
    	return 'Connect to PsgDatabase';
    }
} 

Class Database {
	public function connect(DatabaseInterface $database)
    {
    	return $database->connect();
    }
}

$database = new Database();
$connect = $database->connect(new MysqlDatabase);
dd($connect);

Vamos criar um exemplo nosso, pode ser um boleto bancário de vários bancos.

state of objects

estrutura básica do PHP

- Realizado: O pedido foi feito, mas ainda não foi aceito pelo restaurante.

- Preparando: O restaurante aceitou o pedido e está preparando a comida.

- A Caminho: A comida foi preparada está sendo entregue ao cliente.

- Entregue: A comida foi entregue ao cliente e o pedido está concluído.

ROLES

<?php

namespace App;

class Pedido
{
	public function __construct(private string $estado = "REALIZADO"){}
    
    public function getEstado(): string
    {
    	reutrn $this->estado;
    }
    
    public function setEstado(string $estado): void
    {
    	$this->estado = $estado;
    }
}
<?php

use App\Pedido;

require 'vendor/autoload.php';

$pedido = new Pedido();
$pedido->getEstado();

Orientação a Objetos em PHP

By Luiz Lins

Orientação a Objetos em PHP

Orientação a objetos com PHP.

  • 89