Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Williams Duarte

Namespace "Use"

Recommended Posts

Alguém pode me explicar como esta declaração abaixo utilizando somente o namespace esta pronta para uso.

 

sem usar new ou classname::function()

 

Veja um exemplo com o validation:

use Respect\Validation\Validator as v;
$number = 24782316461;
v::countryCode('BR');
if( v::digit()->cpf()->validate($number) ){
echo 'true';
} else {
echo 'false';
}

Fiquei curioso olhei o código mas são tantas classes que fiquei meio. :wacko:

 

 

Ref.: https://github.com/Respect/Validation

Compartilhar este post


Link para o post
Compartilhar em outros sites

#2 Valeu pela dica!

 

Muito louco esta parada com o namespace

 

quebra um galhão

 

namespace Foo;

class Animal {

    public function species($value) {
		echo $value;
	}  
}

use \Foo\Animal as v;

v::species('Dog');

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ué, agora não entendi. Você chamou estaticamente um método não estático e funcionou. :wacko:

 

Experimente habilitar todos os erros do PHP e trabalhar em modo STRICT... Ate retorna o valor, mas vai te retornar tambem um Strict Standards...

 

Sem contar que os namespaces não servem para "apelidar" as classes, ou só pra isso. Servem principalmente para trabalharmos melhor com autoload de classes, seguir o padrão da PSR-0 e evitar conflitos com nomes de métodos e classes de dferentes "vendors"

 

Alguém pode me explicar como esta declaração abaixo utilizando somente o namespace esta pronta para uso.
sem usar new ou classname::function()
Veja um exemplo com o validation:

Também fiquei curioso quando vi o código do Respect\Validation. Se você se aprofundar um pouquinho mais, talvez fique ainda mais curioso como eu fiquei, ao ver coisas como ReflectionClass e __callStatic, acho até que é essa parte que o fez ficar curioso no código... Chamar uma função de outra classe sem a instanciar ou a chamar diretamente pelo static (Class::method())

:rolleyes:

Compartilhar este post


Link para o post
Compartilhar em outros sites

#5

 

Depois de ter postado lá pela duas da manhã, fui dar uma olhada na classe Validator e vi essa ReflectionClass, e pedi para o notepad++ localizar nos arquivos e nada. ai eu fui dormir...

 

E hoje depois que li seu post, resolvi olhar no manual e ban

 

http://www.php.net/manual/pt_BR/class.reflectionclass.php

 

Não tenho a mínima idéia para que ela serve, mas como também sou curioso nato, vou estuda-la mais adiante.

 

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa resposta envolve vários conceitos! =D

 

A sintaxe é um método estático mesmo. Métodos estáticos sempre são chamados como NomeDaClasse::NomeDoMetodo, por exemplo:

class Exemplo
{
    public function naoEstatico() 
    {
    }
    public static function estatico()
    {
    }
}
Exemplo::estatico(); // Métodos estáticos não tem instância
$foo = new Exemplo();

No exemplo do Respect\Validation ele na verdade usa o método mágico __callStatic, que é um pouco diferente. Ele é chamado quando você chama um método estático que não existe:

class OutroExemplo
{
    public static function euExisto()
    {
    }
    public static function __callStatic($nomeDoDesconhecido, array $argumentos)
    {
    }
}
OutroExemplo::euExisto(); // Esse existe, chama ele
OutroExemplo::abacaxiOuAnanas(); // Não existe, cai pra callStatic

O que o Respect\Validation faz internamente é usar esse mecanismo pra conseguir encadear várias chamadas. Você não pode encadear vários "new" na mesma chamada de métodos, mas pode encadear vários métodos que criam instâncias dentro =)

 

Chamadas encadeadas por __callStatic:

v::string()->alnum()->length(1,20);

Sem chamadas encadeadas:

$string = new Respect\Validation\Rules\String;
$alnum = new Respect\Validation\Rules\Alnum;
$length = new Respect\Validation\Rules\Length(1,20);

$v = new Respect\Validator($string, $alnum, $length);

A ReflectionClass é uma classe que dá informações sobre outras. Por exemplo, se você quiser saber todos os métodos da classe PDO, você pode usar a ReflectionClass assim:

$reflection = new ReflectionClass("PDO"); // Cria uma nova reflection
$methods    = $reflection->getMethods();  // Obtém os métodos
print_r($methods);

A array que esse código vai exibir vai ter um monte de instâncias de outra classe, a ReflectionMethod, que serve pra saber coisas sobre os métodos. Se você quiser uma lista com todos os métodos da PDO, pode fazer:

$reflection = new ReflectionClass("PDO"); // Cria uma nova reflection
$methods    = $reflection->getMethods();  // Obtém os métodos

foreach ($methods as $method) {
    print $method->getName();
}

O Respect\Validation usa o método "newInstanceArgs", que é a mesma coisa que um "new" da ReflectionClass pra repassar os dados do __callStatic pra uma nova instância.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Tash

 

Show Brow! Uma verdadeira aula!!! :clap:

 

Com essa explicação ficou fácil entender sobre:

 

__callStatic

ReflectionClass

Respect\Validation

 

 

Muito obrigado por compartilhar! :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

use \Foo\Animal as v;

 

Só uma informação extra: você não precisa usar uma \ no início de uma expressão use porque use sempre procura a partir do namespace global.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só uma informação extra: você não precisa usar uma \ no início de uma expressão use porque use sempre procura a partir do namespace global.

 

Valeu pela informação!

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.