Ir para conteúdo

POWERED BY:

Arquivado

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

Tiago Souza Ribeiro

[Resolvido] Usar valores de array como parâmetros de função

Recommended Posts

Olá. Estou criando uma funçãozinha aqui para simplificar (eu espero) requires e instanciamentos de classes.

A função até agora está assim (tinha muito mais, mas me confundi tudo e recomecei):

function use_class($class, $params = null, $dir = "lib/", $ext = ".php") {
if(file_exists($dir.$class.$ext)) {
	require_once $dir.$class.$ext;
}
}

 

$class é o nome (com ou sem subdiretório) do arquivo da classe dentro do diretório $dir, e também o nome da classe dentro desse arquivo

$params é um array com os parâmetros a serem passados para o instanciamento da classe

$dir é o diretório a partir da raiz onde estão as classes

$ext é a extensão do arquivo da classe

 

Caso $params não esteja nulo, quer dizer que a classe precisa de parâmetros para ser instanciada

 

Então suponhamos que eu chame essa função assim:

 

use_class("abc/checker", ["name", "email"]);

 

Quero que seja feito isso:

 

require_once "lib/abc/checker.php";
$checker = new checker("name", "email");

 

Só que eu não estou lembrando agora de nenhum método para fazer cada valor do array ser passado, separadamente. Nesse caso aí, seria +/- isso:

 

$checker = new checker($params[0], $params[1]);

 

Alguém tem uma solução?

Compartilhar este post


Link para o post
Compartilhar em outros sites

você já ouviu falar do autoload ?

 

http://php.net/autoload

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu já tentei tentar usar autoload, seguindo esse artigo, mas nunca funciona, não sei o que estou fazendo errado, mas sempre fala que não foi possível carregar a classe: http://www.dreaminco...nd-autoloading/

Também tentei usando __autoload assim:

function __autoload($class) {
if(file_exists("lib/".$class.".php")) {
	require_once "lib/".$class.".php";
}
}

Mas sempre diz que a classe não foi encontrada. Os arquivos das classes estão dentro do diretório lib com o mesmo nome da classe.

Achei mais fácil criar a função que já citei, pois só chamando ela já faria o require, instanciaria a função e tudo mais.

 

Então, alguma solução pro problema dos arrays... parâmetros...?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre o autoload, esse assunto já foi debatido em outro tópico e foi resolvido.

:seta: __autoload chato

 

Sobre passar um array de parâmetros, você pode usar :seta: call_user_func_array

 

 

:thumbsup:

Não pretendo usar autoload mais.

Sobre a função call_user_func_array: vi que pra chamar um método normal é só usar um array no primeiro parâmetro com a variável da classe instanciada e o método. Mas e se o método for static? (não é meu caso, é só uma dúvida). Outra coisa, para chamar o construtor da classe, eu colocaria no primeiro parâmetro assim? array($classe, "__construct")

$classe = new classe;
call_user_func_array(array($classe, "__construct"), array(parâmetros));

 

$parametro0 = $params[0];
$parametro1 = $params[1];
$checker = new checker($parametro0, parametro1);

Nem todas funções terão o mesmo número de parâmetros. Mas pode deixar, acho que a função que o Carlos citou já vai resolver tudo ^^

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Chamando o construtor da classe

<?php

class Foo
{
   public function __construct( $name = null )
   {
       if( ! is_null( $name ) )
       {
           printf( 'Hello %s!', $name );
       }
   }
}

$foo = new Foo( );

call_user_func_array( array( $foo, '__construct' ), array( 'Carlos' ) );

?>

 

Usando método estático

<?php

class Bar
{
   public static function say( $name = null )
   {
       if( ! is_null( $name ) )
       {
           printf( 'Hello %s!', $name );
       }
   }
}

call_user_func_array( 'Bar::say', array( 'Carlos' ) );

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas em uma classe minha aqui por exemplo, os parâmetros do construtor são passados direto pro mysqli, aí vai dar erro é no mysqli (ou a opcionalidade também se aplica a ele?) '-'

 

Ah, outra coisa, na função aqui que que vai usar a call_user_func_array a instância criada será o valor da função, através do return, ex:

 

function use_class($class, array $params = null) {
/*
...
*/
if(!is_null($params)) {
	return new $class;
}
else {
	// Como eu faço aqui?
}
}

//Forma de uso
$instancia = use_class("classe", ["parametro1", "parametro2"]);

Como eu faço lá no else para que seja retornado como valor da função a instância criada com os parâmetros passados pela call_user_func_array?

 

Vou ir testando aqui pra ver se descubro como fazer...

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se os parâmetros da sua classe não são opcionais, vai dar erro sim.

Se você quer mesmo trabalhar desta forma ao invés de usar autoload o jeito é deixar os parâmetros desta e outras classes opcionais.. :thumbsup:

 

[edit]

 

Bom, basta fazer apenas uma alteração (passar o objeto por referência):

<?php

class Foo
{
   private $_message = 'No message';

   public function __construct( $firstname = null, $lastname = null )
   {
       if( ! is_null( $firstname ) and ! is_null( $lastname ) )
       {
           $this->_message = sprintf( 'Hello %s %s!<br/>', $firstname, $lastname );
       }
   }

   public function getMessage( )
   {
       return $this->_message;
   }
}

function use_class( $class, array $params = null )
{
   if( is_null( $params ) )
   {
       return new $class( );
   }
   else
   {
       $obj = new $class( );
       call_user_func_array( array( &$obj, '__construct' ), $params );
       return $obj;
   }
}

echo '<pre>';

$class = use_class( 'Foo', array( 'Carlos', 'Coelho' ) );
echo $class->getMessage( );

$class = use_class( 'Foo' );
echo $class->getMessage( );

 

Saída:

Hello Carlos Coelho!
No message

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.