Ir para conteúdo

POWERED BY:

Arquivado

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

lukoBR

[Resolvido] $this e $this->myClass

Recommended Posts

n entendi o problema, o seguinte código funciona normalmente

 

<?php

class foo {
protected $test = 'oi';

protected function test(){

	echo 'oi';
}
}

class fooextends extends foo {
function __construct(){
	$this->test();
	echo $this->test;
}
}

new fooextends();

?>

 

opa, agora entendi rsrs..

 

$myController = $this->controller .'Controller';
$this->myClass = new $myController($this->action, $this->arguments); 
$this->myClass->$myAction($this->arguments);
/* 

myClass é instancia de testeController 
dentro de Dispatcher

*/

 

implemente o método mágico get na classe Dispatcher

http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members

e sugestão implementar spl_autoload_register (__autoload) na classe Object também http://br.php.net/manual/en/function.spl-autoload-register.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

faça assim

       function __get($name) {
               if (isset($this->$name))
               return $this->$name;
               elseif (isset($this->myClass->$name))
               return $this->myClass->$name;
               else
               return null;
       }

 

acho que fica melhor, você tem acesso nas variáveis da propria classe, e a da $myClass

Compartilhar este post


Link para o post
Compartilhar em outros sites

Má solução, fazer um laço para ver onde tá a classe e tentar inclui-la.. use o:

autoload()

 

http://www.php.net/autoload

Compartilhar este post


Link para o post
Compartilhar em outros sites

E no Object, implementar spl_autoload_register para fazer o trabalho de qual função?

 

spl_autoload_register — Register given function as __autoload() implementation

 

spl_autoload_register http://forum.imasters.com.br/public/style_emoticons/default/seta.gif http://br2.php.net/manual/en/function.spl-autoload-register.php

 

 

Uma boa sugestão acho que seria criar um array com as pastas onde ficam os arquivos com as classes e ir checando uma a uma com um foreach ou um while...

 

Má solução,

 

Simples assim, 'Má solução'

 

Mas o autoload() carrega de uma unica pasta, para usar varias pastas tenho que usar o while e/ou o foreach para checar...

 

Não vou comentar sua import, vou apenas ilustrar como se fazer esse trabalho:

 

<?php
abstract class Loader {
private static $started = false;

public static function __autoload( $class ){
	echo __METHOD__ , ' chamado para ' , $class , PHP_EOL;
	require sprintf( '%s.php' , $class );
}

public static function load( $class ){
	spl_autoload_call( $class );
}

public static function start(){
	if ( !self::$started ){
		spl_autoload_register( array( __CLASS__ , '__autoload' ) );
		self::$started = true;
	}
}

public static function setIncludePath( array $includePath , $overWrite = false ){
	$oldip = explode( PATH_SEPARATOR , ini_get( 'include_path' ) );

	foreach ( $includePath as $key => $path ){
		if ( ( $includePath[ $key ] = realpath( $path ) ) === false ){
			unset( $includePath[ $key ] );
		}
	}

	ini_set( 'include_path' , implode( PATH_SEPARATOR , (bool) $overWrite ?
		$includePath :
		array_unique(
			array_merge( $oldip , $includePath ) )
		)
	);

	if ( !self::$started ) self::start();
}
}

 

Perceba o método setIncludePath, esse método é que fará o trabalho do seu loop. O método load fará o trabalho da sua import, imagina a seguinte hierarquia:

 

/

/index.php

/application

/application/org

/application/org/lib/interface

/application/org/lib/interface/ITeste.php

/application/org/lib/Teste.php

/application/org/lib/Loader.php

/application/com

/application/com/Testar.php

 

/application/org/lib/interface/ITeste.php

<?php
interface ITeste {
public function testando();
}

 

/application/org/lib/Teste.php

<?php
class Teste implements ITeste {
public function testando(){
	echo 'Um teste';
}
}

 

/application/com/Testar.php

<?php
class Testar implements ITeste {
private $teste;

public function __construct(){
	$this->teste = new Teste();
}

public function testando(){
	$this->teste->testando();
}
}

 

/index.php

<?php
require 'application/org/lib/Loader.php';

Loader::setIncludePath( array(
'application/org',
'application/org/lib',
'application/org/lib/interface',
'application/com'
) );

Loader::load( 'Testar' );

$teste = new Testar();
$teste->testando();

 

A saída será:

Loader::__autoload chamado para Testar

Loader::__autoload chamado para ITeste

Loader::__autoload chamado para Teste

Um teste

 

Você poderia utilizar também um diretório que não está no include_path mas que seu antecessor está, passando o nome da diretório, por exemplo:

 

Supondo que tenhamos UmaPasta dentro de /application/org/lib e dentro de UmaPasta tenhamos UmaClasse.php, assim:

/application/org/lib/UmaPasta/UmaClasse.php

 

Para chamar UmaClasse você faria assim:

Loader::load( 'UmaPasta/UmaClasse' );

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os tópicos marcados como [Resolvido] não são fechados, pois podem aparecer novas soluções, ou servirem de ajuda para membros que pesquisarem.

 

Por isso, apenas é adicionada a informação no título, e o tópico continua aberto.

Segundo as diretivas do fórum iMasters, por isso também não posso remover o código do post que você pediu.

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.