How to create an object and methods in PHP

1

I have the following code:

class Database {
    public function __call($name, $arguments) {
        echo $name;
    }
}

And I can do this:

require_once 'Database.php';
$db = new Database();
$db->usuarios();

I wish I could do this:

$db->usuarios->inserir($obj);

Is this possible using the magic __call() method?

    
asked by anonymous 21.02.2016 / 01:12

2 answers

2

In PHP __call is used when calling a method or function, something like $baz->foo(); , when calling $baz->y->x(); __call is not triggered, because ->y is an object variable, for this you should read about __get and __set , they are triggered when we try to write or read inaccessible data / variables (not declared in the class).

Here's an example:

<?php
//Classe da tabela usuarios
class ClasseUsuarios
{
    public function inserir($b)
    {
    }
}

//Classe principal
class Database
{
    private $forceWrite = false;
    private $data = array();

    public function __construct()
    {
            //Libera a gravação de qualquer dado em $this->data
            $this->forceWrite = true;

            //Define a classe ClasseUsuarios para $this->data[usuario]
            $this->usuarios = new ClasseUsuarios();

            //Bloqueia a gravação da variável $this->data[usuario]
            $this->forceWrite = false;
    }

    public function __set($key, $value)
    {
        //Checa se é permitido o valor $this->data[usuarios]
        if ($key !== 'usuarios' || $this->forceWrite) {
            //Grava o valor para variáveis não declaradas na classe
            $this->data[$key] = $value;
        }
    }

    public function __get($key)
    {
        //Lê o valor de variáveis não declaradas na classe
        return isset($this->data[$key]) ? $this->data[$key] : NULL;
    }

    public function __isset($key)
    {
        //Se usar empty ou isset em variáveis não declaras irá verificar se ela existe em '$this->data'
        return isset($this->data[$key]);
    }
}

//Objeto ficticio
$obj = array();

//Chama a classe principal
$foo = new Database();

//Vai chamar o método new ClasseUsuarios()->inserir();
$foo->usuarios->inserir($obj);

$foo->usuarios = NULL; //Se tentar gravar a variavel usuarios nada acontece

/*
 * Vai chamar o método new ClasseUsuarios()->inserir();
 * sem ser afetado pelo '$foo->usuarios = NULL;'
 */
$foo->usuarios->inserir($obj);

Documentation: link

    
21.02.2016 / 17:28
1

In PHP this is called lambda_style or Anonymous , to make the implementation easier to create Auxiliary Class (DinamicMethod), now just have fun :) and test.

Do not try to direct the Database class, the __ call method was not designed to fetch Anonymous within class attributes and yes, so we made the DinamicMethod class.

<?php

class DinamicMethod {

    public function __construct() {

        #leia sobre create_function http://php.net/manual/pt_BR/function.create-function.php
        $this->inserir = create_function('', 'echo "Eu sou Uma funcao anonima";');
        $this->deletar = create_function('', 'echo "Eu sou Uma funcao anonima e deleto";');

    }


    public function __call($metodo, $argumentos) {

        #Checa se o objeto ou a classe tem uma propriedade
        if (property_exists($this, $metodo)) {

            #Verifica se o conteúdo da variável pode ser chamado como função
            if (is_callable($this->$metodo)) {
                #Chama uma dada função de usuário com um array de parâmetros
                return call_user_func_array($this->$metodo, $argumentos);
            }
        }
    }
}


class Database {

    public $usuario;

    public function __construct() {

        #objeto de classe padrão php
        $this->usuario = new DinamicMethod();       

    }




}

$db = new Database();
$db->usuario->deletar();
    
21.02.2016 / 13:29