Re: Obtener array de un método.

[email protected] (Carlos Medina)
Newsgroups php.general.es
Organization SimplyNetworks
Message-ID <[email protected]>
Am 20.05.2011 11:10, schrieb Pablo Braulio:
> Hola a todos.
>
> A ver si alguno me puede ayudar con esto.
>
> He creado una un método en una clase para que ejecute la apertura de
> un fichero (fopen).
>
> Intento sacar el contenido de esa apertura desde otro método y no me funciona.
>
> Os pongo el código.
> class ficheros {
> 	protected $files= array('prueba', 'otro');
> 	protected $dir= '../traduc';
> 	
> 	public function abrirPo(){
> 		foreach ($this->files as $file) {
> 			$parthFPo= $this->dir.'/'.$file.'.po';
> 			
> 			return fopen($parthFPo, 'r');
> 		}
> 	}
> }
>
> Con esto si ejecuto
>
> $fich= new ficheros();
> $fich->abrirPo();
>
> print_r($fich);
>
> El resultado es:
>
> ficheros Object
> (
>      [files:protected] =>  Array
>          (
>              [0] =>  prueba
>              [1] =>  otro
>          )
>
>      [dir:protected] =>  ../traduc
> )
>
> Creo otro método en la misma clase para ejecutar fgets:
>
> public function leerPo(){
> 		
> 	foreach($this->abrirPo() as $po){
> 			$numLinea= 0;
> 			
> 			while (!feof($open)){
> 				if($contenido= fgets($open)){
> 					echo $numLinea.'--'.$contenido."\n";
> 				}
> 			}
> 		}
> 	}
>
> Y el resultado es :PHP Warning:  fgets() expects parameter 1 to be resource
>
> Me da la sensación de que no se está sacando obteniendo nada del método abrirPo.
>
> ¿Alguien sabe decirme como hacerlo?.


Hola,
fopen te devuelve un resource (pointer sobre el file) que es el que usa 
fputs o fget para poder trabajar. Al llamar asi el fopen estas 
devolviendo el recurso al nirvana. Ademas la variable $open no es la 
adecuada en el metodo leer po.

$recurso = $fich->abrirPo();

Como estas haciendo un foreach, devuelves muchos recursos al mismo 
tiempo por lo que el ultimo recurso es el que vas a poder utilizar, no 
obstante los otros files van a quedar abiertos. Ademas de esto no es muy 
usual devolver un fopen que formas en un foreach. Te recomiendo que 
hagas lo siguiente:

1.- Haz la clase ficheros singleton
2.- Haz el metodo abrirPo con llamada estatica utilizando el array como 
variable de metodo en la declaracion del mismo y pones los recursos en 
una variable array tambien estatica de tipo privada.
3.- En el metodo leerPo puedes acceder a la variable privada con 
self::$variableEstaticadeRecursos para poder leer desde alli

Te lo pongo mas facil:

  class Ficheros {
	public static     $instance = null;
	private static    $resArray = null;
	protected static  $dir= '../traduc';
	protected static  $files= array('prueba', 'otro');

	public static get(){
	   if( self::$instance === null){
		self::$instance = new self;
	   }
	}

	public static function abrirPo( Array $files ){
  		foreach ($files as $file) {
			if( file_exists($file){
			   $parthFPo= self::$dir.'/'.$file.'.po';
  			   self::$resArray[] = fopen($parthFPo, 'r');
			}
  		}
  	}

	public static function leerPo(){
		try
		{
		   self::abrirPo( self::$files);
		}
		catch( Exception $e )
		{
		   echo $e->getMessage();
		   return false;
		}

		if( count(self::$resArray) > 0 )
		{
		   foreach( self::$resArray as $key => $po){
  			$numLinea= 0;
  			while (!feof($po)){
  				if($contenido= fgets($open)){
  					echo $numLinea.'-  '.$contenido."\n";
  				}
  			}
		   }
  		}
  	}	
  }

se usa:

try
{
    Ficheros::leerPo();
}
catch(Exception $e)
{
    $e->getMessage();
}

No se si funciona pero a ver como te va. Me dices como lo resolviste. me 
interesa

Salu2

Carlos Medina
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.