Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Se crea una instancia ?

Estas en el tema de Se crea una instancia ? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola y disculpen por lo poco descriptivo del titulo....pero tengo una clase palabra que ante ciertos metodos devuelve objetos del mismo tipo (palabra) Cuando busco ...
  #1 (permalink)  
Antiguo 03/09/2009, 08:06
 
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 15 años, 5 meses
Puntos: 10
Pregunta Se crea una instancia ?

Hola y disculpen por lo poco descriptivo del titulo....pero tengo una clase palabra que ante ciertos metodos devuelve objetos del mismo tipo (palabra)

Cuando busco si una palabra esta categorizada como 'warez' si no la encuentro, entonces me fijo si estaba dada en singular y busco el plural y viceversa.

El problema lo tengo al tratar de obtener el singular o plural para hacer la nueva consulta:

Código PHP:
if ($this->plural){
  
$word2 self::singular()->getWord();
}else{
  
$word2 self::plural()->getWord();
}    
$sql "SELECT type FROM dicx WHERE word='{$this->word2}' and type='w'";  
$rs  $this->con->execute ($sql); 
Especificamente cuando hago $word2 = self::singular()->getWord(); me queda la duda si me genera una nueva instancia con el singular ya que singular() es un metodo que devuelve el singular como objeto de tipo palabra:


Código PHP:
// devuelve el singular (singulariza)
    
public function singular (){
      if (
$this->word[strlen($this->word)-1]=='s'){
        if (
$this->word[strlen($this->word)-2]=='e'){ // -es           
          
$wordm substr ($this->word,0,-2);
        }else{          
          
$wordm substr ($this->word,0,-1);  // -s
        
}      
      }
      if (
strlen ($wordm)==0){
        
$wordm=$this->word;
      }
      
$nw = new word($wordm);      
      return 
$nw;
    } 
Espero puedan ayudarme........gracias!
  #2 (permalink)  
Antiguo 03/09/2009, 08:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 7 meses
Puntos: 2135
Respuesta: Se crea una instancia ?

Pues en tu código tienes puesto expresamente $nw = new word($wordm) por lo que sí, el método singular (que debería ser static por lo que veo) sí te devuelve una instancia de word, y luego devuelves la palabra usando getWord().

Recuerda que cuando tu usas el operador new creas una nueva instancia del objeto que estes creando.

Saludos.
  #3 (permalink)  
Antiguo 03/09/2009, 08:25
 
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 15 años, 5 meses
Puntos: 10
Respuesta: Se crea una instancia ?

Bueno.......ahora FUNCIONA... solo arreglando la consulta pero no entiendo lo de porque singular() debe ser un metodo estatico (?)

Me podrian hechar luz al respecto ? como seria? no hago el NEW al final del metodo ?

Dejo el codigo "completo" (lo que hice hasta ahora)... a ver si me orientan:

Código PHP:
<? 
  
Include('adodb5/adodb.inc.php');
  
$conNewADOConnection('mysql');
  
$con->connect('localhost''root''','diccio');
  
$con->debug=true

  
$pal = new word('seriales');  
  
$pal->setCon ($con); // necesaria para acceder a 'diccionarios'
  
  
echo $pal->singular();  
  
var_dump ($pal->is_warez());

  
//////////////////////////////////////
  
class Word {
  
    private 
$word=NULL;
    private 
$con// conexion a la DB
    
private $plural;

    public function 
is_warez(){        
      
$sql "SELECT type FROM dicx WHERE word='{$this->word}' and type='w'";
      
$rs  $this->con->execute ($sql);
      if (
$rs->RecordCount()!=0){
        return 
TRUE;
      }else{
        if (
$this->plural){           
          
$word2 self::singular()->getWord();
        }else{           
          
$word2 self::plural()->getWord();
        }    
        
$sql "SELECT type FROM dicx WHERE word='{$word2}' and type='w'";  
        
$rs  $this->con->execute ($sql);
        return (
$rs->RecordCount()!=0);
      }      
    }
    
        
    public function 
is_common(){ // la,las,para,con,contra,...
    
}
    
    
// devuelve el singular (singulariza)
    
public function singular (){
      if (
$this->word[strlen($this->word)-1]=='s'){
        if (
$this->word[strlen($this->word)-2]=='e'){ // -es                       
          
$wordm substr ($this->word,0,-2);
        }else{          
          
$wordm substr ($this->word,0,-1);  // -s
        
}      
      }
      
//if (strlen ($wordm)==0){
        //$wordm=$this->word;
      //}            
      
$nw = new word($wordm);            
      return 
$nw;
    }
  
    
// devuelve el plural (pluraliza)
    
public function plural (){
      if (
$this->is_vowel($this->word[strlen($this->word)-1])){
        
$wordm $this->word 's';
      }else{
        
$wordm $this->word .'es';
      }  
      
$nw = new word($wordm);      
      return 
$nw;
    }
  
    
// dice si es vocal
    
private function is_vowel ($char){
      if (
strlen($char)==1){
        
$vocales str_split('aeiouáéíóú');    // comparar en minusculas
        
$out = (in_array($char,$vocales));
      }else{
        
$out=FALSE// tambien podria generar una excepcion 
      
}          
      return 
$out;
    }
      
    public function 
define_if_its_plural(){
      
$this->plural = ( ($this->word[strlen($this->word)-1]=='s') and (strlen($this->word)>=3)) ;
    }    
    
    
// devuelve si es plural    
    
public function is_plural (){
      return 
$this->plural ;
    }    
    
    public function 
is_singular (){
      return (!
$this->plural);
    }    
    
    public function 
setWord($w){
      
$this->word=$w;
    }
    
    public function 
getWord(){
      return 
$this->word;
    }
    
    public function 
setCon ($con){
      
$this->con=$con;
    }  
  
    public function 
__tostring(){
      return 
$this->word;
    }
    
    public function 
__construct ($w=NULL){      
      
$this->word $w;
      
$this->define_if_its_plural();
    }  
  } 
#fin de clase

Última edición por bigwhite; 03/09/2009 a las 08:40
  #4 (permalink)  
Antiguo 03/09/2009, 09:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 7 meses
Puntos: 2135
Respuesta: Se crea una instancia ?

Debe de ser estatico porque así lo llamas (self::singular()) aunque dentro de singular usas $this en ese caso es un error.

Los métodos estaticos no tienen dentro $this por lo que si vas a llamar un método que no ocupe $this este debe de ser estatico y lo llamas con el nombre de la clase: Class1::staticMethod() En tu caso tienes que cambiar las llamadas de self::singular() y self::plural() por $this->singular() o $this->plural().

Saludos.
  #5 (permalink)  
Antiguo 03/09/2009, 10:41
 
Fecha de Ingreso: agosto-2009
Mensajes: 247
Antigüedad: 15 años, 5 meses
Puntos: 10
Pues....SI, ahora tambien funciona..y debe ser correcto

Gracias!

Una ultima duda: tengo un diccionario de palabras... y lo definí con una "interface" porque quizas use diferentes diccionarios (de sinonimos, antonimos, etc)

Quisiera estar SEGURO de que va a devolver objetos de tipo 'word',... se puede hacer eso con interfaces ? deberia haberlo hecho con una clase abstracta y herencia ?

Código PHP:
 interface diccionario 
  
{  
    public function 
getMeaningAmount(); // = dameCant  
    
public function getMeaning();
  }

  class 
synonyms implements diccionario {
  ...
  } 
GRACIAS!

Última edición por GatorV; 03/09/2009 a las 10:59
  #6 (permalink)  
Antiguo 03/09/2009, 11:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 7 meses
Puntos: 2135
Respuesta: Se crea una instancia ?

No puedes en una interfaz definir que tipo de objetos va a regresar, eso ya es en la implementación, solo puedes poner que tipo de objetos va a aceptar como parámetro.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:04.