Nueva pregunta

Pregunta:

Fecha: 27-08-2015 17:51:25 (En Español)

Conceptos, que no entiendo de: POO PHP[Resuelta]

Hola, Compañeros, no hace mucho me dedique aprender POO en PHP, y aun no termino los las clases pero me entraron dudas a la hora de programas en POO:

1. Por que no es posible usar variables "Globales" dentro de una clase y si es posible usarlos en esta programacion orientada objetos, ya sea afuera o dentro de las clases?

2. Casi lo mismo y es que no entiendo por que no funciona esto:

<?php
class pop {
	public $log = 'POO';
	private $loge = trim($log); // <-- se puede poner esto en POO?
	
	public function getPter() { // getter
	return $this->loge;
	}
}

$jer = new pop();
echo $jer->getPter() . $jer->log;
?>

// ste codigo fallara error: Parse error: syntax error, unexpected '(', expecting ',' or ';' in C:\xampp\htdocs\pooclass.php on line 4


queria saber como hacer eso en POO , ya que no si no se puede , no le hayo muchi chiste a esto 7.7

Eso era todo espero y me puedan ayudar a entender algo mas la programacion orientada a objetos.

Saludos.
Etiquetas: Empezar a programar - PHP - POO - Pregunta - Programación Orientada a Objetos Votos: 1 - Respuestas: 9 - Vistas: 20 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 28-08-2015 13:01:56 Chrismart:

    No lo verifique, probalo, seria algo asi:

    <?php
    
    error_reporting(E_ALL ^ E_NOTICE);
    
    /**
     * clase pop
     */
    class pop {
    /**
     * [$apellido apellido de alguien]
     * @var string
     * [$nombre nombre de alguien]
     * @var string
     */
    	public $apellido = 'Perez';
    	public $nombre = 'Juan'; 
    /**
     * [getApellidoNombre leo el nombre y apellido]
     * @return [string] 
     */
    	public function getApellidoNombre() 
    	{ 
    
    	$apellido	=	trim(apellido);	
    	$nombre	    =	trim(nombre);	
    	return $this->apellido .' '. $this->nombre;
    	}
    }
    /**
     * Instancio la clase pop
     * Imprimo funcion getApellidoNombre de la clase pop
     */
    $resultado = new pop();
    echo $resultado->getApellidoNombre() ;
    ?>
      Votos: 1 - Link respuesta
     
  • Fecha: 28-08-2015 14:27:05 Daniel, esta mas que perfecto logre entenderle incluso en lo otro :') devolviendote el codigo que hicistes con el analisis que le di:

    <?php
    /*
    class pop {
    	public $log = 'POO';
    	private $loge = trim($log); // <-- se puede poner esto en POO?
    	
    	public function getPter() {
    	return $this->loge;
    	}
    }
    
    $jer = new pop();
    echo $jer->getPter() . $jer->log;
    */
    error_reporting(E_ALL ^ E_NOTICE);
    
    /**
     * clase pop
     */
    class pop {
    /**
     * [$apellido apellido de alguien]
     * @var string
     * [$nombre nombre de alguien]
     * @var string
     */
        private $apellido = ' Perez Poter ';
        public $nombre = ' Juan '; 
    /**
     * [getApellidoNombre leo el nombre y apellido]
     * @return [string] 
     */
        public function getApellidoNombre() 
        {   
        $apellido = trim(apellido);    
        $nombre = trim(nombre);  
        return sha1($this->apellido .'   '. $this->nombre); // solo le puse sha1 para comprobar rapidamente 7.7
        }
    }
    /**
     * Instancio la clase pop
     * Imprimo funcion getApellidoNombre de la clase pop
     */
    $resultado = new pop();
    echo $resultado->getApellidoNombre(); // o desde aqui tambien pude poner echo sha1($resultado->getApellidoNombre()); he igual hubiera funcionado ^^
    ?>
    


    Ahora solo me queda duda, es posible usar las super variables dentro o fuera de la clase pero que tenga funcionalidad con la clase? supongo que si n.n
      Votos: 0 - Link respuesta
     
  • Fecha: 28-08-2015 14:32:23 Según yo te hace falta hacer el constructor de la clase pop, algo como:

    <?php
    class pop{
         public $log = 'POO';
         private $loge = trim($log);
         
         function __construct(){
               $this->log = 'POO';
         }
    
         public function getPter() { // getter
               return $this->loge;
         }
    }
    $jer = new pop();
    echo $jer->getPter() . $jer->log;
    ?>
    


    También puedes dejar el constructor con el nombre de la clase:
    function pop(){
    }

    Podrias revisar estos links, ahí te explican como utilizar cada una de las formas:
    http://php.net/manual/en/oop4.constructor.php y http://php.net/manual/en/language.oop5.decon.php

    Ahora por lo de las variables globales, creo que no se usan en las clases de POO ya que estás encapsulando funciones y "comportamientos" de cada clase, por lo que tener atributos globales rompería con este encapsulamiento y el reciclar código. En ese caso mejor pasas la variable que va a ser global como argumento al método en el que la vas a necesitar.

    El chiste de la POO es poder hacer módulos fáciles de "mover", de un sistema a otro o de un programa a otro, sin tener que modificar nada y que si es necesario se le pueda agregar, mas no modificar. Lograr tener una alta cohesión y baja adherencia es de las principales metas de la POO.
      Votos: 3 - Link respuesta
     
  • Fecha: 28-08-2015 15:23:42 Israel estas en lo correcto le falto un constructor que se me olvido ponerlo aunque tambien podria haber funcionado asi:

    class pop{
         public $log = 'POO';
         private $loge = 'Privado';
         
         public function getMetodo($part) {
               return $this->log . $part;
         }
         public function getPter() { // getter
               return $this->loge;
         }
    }
    $jer = new pop();
    echo $jer->getPter() . $jer->getMetodo(" Hola");
    


    aunque es mas recomendable como tu lo hicistes ya que como minimo se recomienda usar un contructor en una clase no mas eso seria un error, y sobre lo otro ya mas o menos sabia ya que lo habia visto en crystal lab, aunque quize preguntar n.n

    aunque gracias por dar tu opinion =') ya resolvi mis dudas...
    Saludos.
      Votos: 1 - Link respuesta
     
  • Fecha: 29-08-2015 07:31:43 Chrismart:

    No es obligatorio en una class tener un constructor __construct, solo lo utilizas en caso de que lo necesites ... en el ejemplo que te envie, funciona la class, pese a que no cuenta con un constructor

    Un saludo
      Votos: 1 - Link respuesta
     
  • Fecha: 29-08-2015 08:10:44 Disculpa, arriba de la foto de perfil hay unas flechas donde puedes ir votando por la(s) respuestas que te sirvieron. Podrías hacerlo por favor? :) gracias!!   Votos: 2 - Link respuesta
     
  • Fecha: 29-08-2015 13:29:29 Gracias, por aclarar eso Daniel :) y Israel claro que si doy likes pongamosle que es eso, y disculpa pero si quieres te doy ese like.... Ok lo tomo como un si n.n   Votos: 1 - Link respuesta
     
  • Fecha: 30-08-2015 00:10:52 Chrismart Anji,
    1. Sí se pueden utilizar las variables globales en una clase pero no es buena práctica porque generas una dependencia externa. Como bien menciona Israel es mejor que esa dependencia externa se la proporciones a tu clase a través de un método.
    2. Tu inicialización no funciona porque estás asignándole el valor que regresa una función, es decir que el valor estará disponible en tiempo de ejecución y no de compilación que es cuando ocurre la asignación.
    Sugerencias:
    Es buena costumbre proporcionar un constructor pero cuando lo hagas trata en la medida de lo posible que este no haga nada más allá de inicializar propiedades (Te facilitará la vida cuando hagas tus pruebas unitarias). Si tu constructor no hace absolutamente nada puedes omitir su declaración pero te repito que es buena práctica declararlos aunque sea vacíos.
    Esto va también para Israel León: Es mala práctica desde ya hace algunos años que tus constructores se llamen de igual manera que tu clase, es algo que se usaba en PHP4. En PHP5 también lo puedes hacer, el objetivo de soportarlo era ser compatible con la implementación anterior y que los desarrolladores poco a poco adoptaran el estándar de __construct. Es mala práctica y puede generar confusión porque no funciona en todos los casos y también genera incongruencias en tu código. De hecho en PHP7 ya desplegará un mensaje advirtiendo que su uso es obsoleto.
    Otra buena costumbre es que las variables no sean directamente accesibles, piensa en los objetos como en cajas negras donde puedes interactuar con ellos a través de sus comportamientos (métodos), puedes interactuar con los componentes individuales (propiedades) a través de un setter o getter. Dependiendo de lo que haga tu clase y las necesidades muy particulares de la misma puede ser que necesites que tus variables tengan un setter, un getter, los dos o ninguno. Un caso donde siempre necesitarás un setter es cuando manejes inyección de dependencia :)
    Espero mi aporte te sirva.

    Saludos
      Votos: 3 - Link respuesta
     
  • Fecha: 02-09-2015 22:15:45 Claro que si Ernesto, gracias por aportar y por tu tiempo =')   Votos: 1 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com