Foros del Web » Programando para Internet » PHP »

includes class fuera de function

Estas en el tema de includes class fuera de function en el foro de PHP en Foros del Web. Hola amigos No entiendo porque no funciona el include fuera de las funciones y tengo que estar metiendo la conexion en cada funcion. Os pongo ...
  #1 (permalink)  
Antiguo 05/02/2016, 04:57
 
Fecha de Ingreso: diciembre-2015
Mensajes: 64
Antigüedad: 8 años, 3 meses
Puntos: 0
includes class fuera de function

Hola amigos
No entiendo porque no funciona el include fuera de las funciones y tengo que estar metiendo la conexion en cada funcion. Os pongo a continuacion los ejemplos para que lo entendais mejor.

conectar.class.php
---------------------------------------------------
Código PHP:
Ver original
  1. class conectar {
  2.    
  3.     public function conexion() {
  4.         $link_id = new mysqli($this->host,$this->user,$this->pass,$this->db);  
  5.     }
  6.  
  7.  
  8. }

conexion.php
---------------------------------------------------
Código PHP:
Ver original
  1. require_once ("conectar.class.php");
  2. $clase = new conectar();
  3. $link = $clase->conexion();


archivo.php (NO FUNCIONA)
---------------------------------------------------

Código PHP:
Ver original
  1. include ('conexion.php');
  2.  
  3. function prueba() {  
  4.  
  5.     $query = $link->query("");
  6.  
  7. }
  8.  
  9. function prueba2() {  
  10.  
  11.     $query2 = $link->query("");
  12.  
  13. }
  14.  
  15. function prueba3() {  
  16.  
  17.     $query3 = $link->query("");
  18.  
  19. }

archivo.php (SI FUNCIONA)
---------------------------------------------------

Código PHP:
Ver original
  1. function prueba() {  
  2.     require_once ("conectar.class.php");
  3.     $clase = new conectar();
  4.     $link = $clase->conexion();
  5.    
  6.     $query = $link->query("");
  7.  
  8. }
  9.  
  10. function prueba2() {  
  11.     require_once ("conectar.class.php");
  12.     $clase = new conectar();
  13.     $link = $clase->conexion();
  14.  
  15.     $query2 = $link->query("");
  16.  
  17. }
  18.  
  19. function prueba3() {  
  20.     require_once ("conectar.class.php");
  21.     $clase = new conectar();
  22.     $link = $clase->conexion();
  23.  
  24.     $query3 = $link->query("");
  25.  
  26. }


Seguramente que se me escapa algo.

saludos
gracias :)
  #2 (permalink)  
Antiguo 05/02/2016, 05:24
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: includes class fuera de function

Cita:
No entiendo porque no funciona el include fuera de las funciones y tengo que estar metiendo la conexion en cada funcion
Bueno, seguramente no lo entiendes porque jamás has leído un manual de PHP.

Te explico: el problema que experimentas se le conoce como alcance, contexto o scope, etc.

Existen tanto variables locales como globales, ambos son contextos muy diferentes y no se comparten entre si.

Las variables que declaras fuera de clases y/o funciones son consideradas globales, caso contrario son locales.

Las funciones y/o métodos de una clase no pueden acceder al contexto global de manera directa.

Consulta el siguiente manual: http://php.net/manual/es/language.variables.scope.php
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 05/02/2016, 05:58
 
Fecha de Ingreso: diciembre-2015
Mensajes: 64
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: includes class fuera de function

hola pateketrueke !

Segun he entendido en el manual (corrigeme si me equivoco por favor )
con añadir dentro de cada function "global $link;" es suficiente. Lo he probado y si funciona, pero queria asegurarme que es lo mas correcto.

ejemplo
---------------------

Código PHP:
Ver original
  1. function prueba() {  
  2.         global $link;
  3.         $query = $link->query("");
  4.      
  5.     }
  6.      
  7.     function prueba2() {  
  8.         global $link;
  9.         $query2 = $link->query("");
  10.      
  11.     }
  12.      
  13.     function prueba3() {  
  14.         global $link;
  15.         $query3 = $link->query("");
  16.      
  17.     }


saludos
gracias !!
  #4 (permalink)  
Antiguo 05/02/2016, 06:29
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: includes class fuera de function

Pues sí, funciona, pero no es buena práctica usar variables globales por doquier.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 05/02/2016, 06:39
 
Fecha de Ingreso: diciembre-2015
Mensajes: 64
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: includes class fuera de function

vaya !
entoces.. que me recomiendas ?

saludos
muchas gracias
  #6 (permalink)  
Antiguo 05/02/2016, 06:48
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: includes class fuera de function

Pues recuerda que las funciones pueden devolver valores, podrías usar eso:
Código PHP:
Ver original
  1. function conectar() {
  2.   require_once 'conectar.class.php';
  3.   $clase = new conectar();
  4.   return $clase->conexion();
  5. }
  6.  
  7. // ...
  8.  
  9. function foo($bar) {
  10.   $link = conectar();
  11.   return $link->query(/* ... */);
  12. }
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 05/02/2016, 10:15
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: includes class fuera de function

También podrías tener esas funciones como métodos de una función que herede de la clase de conexión, de esa manera, no tendrás que volver a incluir la línea de conexión en cada llamada y, además, podrás acceder directamente a la variable de conexión.

Código PHP:
Ver original
  1. class Conectar{
  2.     public $link_id;    
  3.     public function __construct(){
  4.         $this->link_id = new mysqli($this->host,$this->user,$this->pass,$this->db);  
  5.     }
  6. }
  7.  
  8. class Hija extends Conectar{
  9.     public function __construct(){
  10.         parent::__construct();
  11.     }
  12.     public function prueba(){
  13.         $query = $this->link_id->query("La consulta SQL");
  14.     }
  15. }

Con lo cual, solo tendrías que instanciar a la clase "Hija":
Código PHP:
Ver original
  1. $instancia = new Hija();

Como al instanciar a la clase se ejecuta su método constructor y este ejecuta el de la clase "Conectar", la conexión se realiza y puedes acceder a la variable de conexión desde cualquiera de los métodos de la clase "Hija".

Un saludo
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #8 (permalink)  
Antiguo 11/02/2016, 05:39
 
Fecha de Ingreso: diciembre-2015
Mensajes: 64
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: includes class fuera de function

Hola Alexis88,
muchas gracias por tu respuesta.
La estoy intentando poner en practica, pero algo me falla, no entiendo al 100% tu explicacion. Perdona.
Dejo a continuacion mi ejemplo:


conexion.class.php
---------------------------------------------------

Código PHP:
Ver original
  1. class con{
  2.    
  3.     private $host = 'localhost';
  4.     private $user = 'root';
  5.     private $pass = 'root';
  6.     private $db = 'pruebas';
  7.    
  8.     public $link_id;
  9.        
  10.     public function bd_conecta(){
  11.         $this->link_id = new mysqli($this->host,$this->user,$this->pass,$this->db);  
  12.     }
  13.    
  14. }
  15.  
  16. class conectar extends con{
  17.    
  18.     public function bd_conecta(){
  19.         parent::bd_conecta();
  20.     }
  21.    
  22. }


conx.php
---------------------------------------------------
Código PHP:
Ver original
  1. include_once("conexion.class.php");
  2. $clase = new conectar();
  3. $link = $clase-> bd_conecta()();



conx.php
---------------------------------------------------
Código PHP:
Ver original
  1. class prueba(){
  2.    
  3.     include_once("conx.php");
  4.    
  5.     function prueba(){
  6.         $query = $link->query("SELECT..");
  7.         $total = $query->num_rows;
  8.     }
  9.  
  10. }




saludos
gracias
  #9 (permalink)  
Antiguo 11/02/2016, 09:53
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: includes class fuera de function

El método prueba() tiene que estar o bien en la clase conectar o si deseas dejarla en la clase prueba (no deberías nombrar de la misma forma a una clase y a un método de la misma), esta debe heredar de la clase de conexión.

Puedes tener en un archivo a la clase de conexión:
Código PHP:
Ver original
  1. //Archivo A
  2. class Con{
  3.     //Contenido
  4. }

Y en otro a la clase que heredará la clase de conexión:
Código PHP:
Ver original
  1. //Archivo B
  2. include_once 'archivo de la clase de conexión';
  3.  
  4. class Conectar extends Con{
  5.     public function bd_conecta(){
  6.         parent::bd_conecta();
  7.     }
  8.  
  9.     public function prueba(){
  10.         $this->bd_conecta(); //Invocas al método que invoca al método de la clase de conexión
  11.         $query = $this->link_id->query("SELECT..");
  12.         $total = $query->num_rows;
  13.     }
  14. }

Fíjate que utilizo a la variable $link_id de la clase de conexión, pues esta es la que posee la instancia de la conexión, y utilizo la variable reservada $this para hacer referencia a la clase.

Trata de no repetir nombre. Puedes utilizar métodos constructores que ejecutarán las instrucciones que posean de manera automática cuando la clase sea instanciada. Procura que los nombres de las clases empiecen por mayúscula (por un tema de convención de nombres [otra referencia]).

Un saludo
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #10 (permalink)  
Antiguo 11/02/2016, 10:48
 
Fecha de Ingreso: diciembre-2015
Mensajes: 64
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: includes class fuera de function

Prefiero poner le metodo "metodoprueba" en la clase "Prueba", porque dentro de esta clase va a ver mas consultas diferentes.
Quiero seguir la estructura que pongo porque dentro de la conx.php quiero añadir mas cosas.


conexion.class.php
---------------------------------------------------
Código PHP:
Ver original
  1. class Con{
  2.        
  3.         private $host = 'localhost';
  4.         private $user = 'root';
  5.         private $pass = 'root';
  6.         private $db = 'pruebas';
  7.        
  8.         public $link_id;
  9.            
  10.         public function bd_conecta(){
  11.             $this->link_id = new mysqli($this->host,$this->user,$this->pass,$this->db);  
  12.         }
  13.        
  14.     }
  15.      
  16.     class conectar extends Con{
  17.        
  18.         public function bd_conecta(){
  19.             parent::bd_conecta();
  20.         }
  21.        
  22.     }

conx.php
---------------------------------------------------
Código PHP:
Ver original
  1. include_once("conexion.class.php");
  2.     $clase = new conectar();
  3.     $link = $clase-> bd_conecta()();


prueba.class.php
---------------------------------------------------
Código PHP:
Ver original
  1. class Prueba(){
  2.        
  3.         include_once("conx.php");
  4.        
  5.         function metodoprueba(){
  6.             $query = $link->link_id->query("SELECT..");
  7.             $total = $query->num_rows;
  8.         }
  9.      
  10.     }


hice lo cambios segun te entendi pero me sigue sin funcionar.
creo que no lo comprendo muy bien

saludos

Última edición por RicardGTX; 11/02/2016 a las 10:56
  #11 (permalink)  
Antiguo 11/02/2016, 11:27
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: includes class fuera de function

Si la clase no hereda de la clase de conexión, es lógico que eso no funcione. Vuelve a analizar el código de ejemplo y, por favor, lee la explicación.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #12 (permalink)  
Antiguo 11/02/2016, 13:57
 
Fecha de Ingreso: diciembre-2015
Mensajes: 64
Antigüedad: 8 años, 3 meses
Puntos: 0
Respuesta: includes class fuera de function

ahhh vale, entendi ! ahora si
Muchas gracias alexis88 !!!!

pero.. ahora me viene otra duda a la cabeza, si necesito otra clase, puede ser tambien heredada de la clase conexion, es decir, todas las clases que creo las hago heredadas de la clase conexion ??

saludos :)
  #13 (permalink)  
Antiguo 11/02/2016, 14:20
 
Fecha de Ingreso: febrero-2016
Mensajes: 14
Antigüedad: 8 años, 2 meses
Puntos: 0
Respuesta: includes class fuera de function

Creo que te falta leer un poco sobre programación orientada a objetos (POO), ya que no tenes bien claros los conceptos de clases, instancias, herencia, etc. Te dejo el link a un libro muy cortito pero que sirve mucho: https://www.dropbox.com/s/xaueuq7vw3rkzeh/eugeniabahitpooymvcenphp.pdf?dl=0
Con que leas hasta la 32 está bien.

Podés heredar todas las clases que quieras de la clase Conexión, pero no es que cada vez que quieras utilizar un método de esa clase vas a tener que heredarla, para eso existe el require o el include el cual debes usar fuera de la declaración de la clase, como te indico a continuación:

Clase 1:
Código PHP:
class Clase1 {
    
    public function 
metodo1() {
        return 
'algun texto';
    }

Clase 2(que hace require de Clase1 y utiliza su método):
Código PHP:
require 'Clase1.php';

class 
Clase2 {
    
    public function 
metodo2() {
        
$clase1 = new Clase1();
        echo 
$clase1->metodo1();
    }
}

$clase2 = new Clase2();
$clase2->metodo2(); 
Saludos
  #14 (permalink)  
Antiguo 11/02/2016, 14:44
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: includes class fuera de function

Cita:
Iniciado por RicardGTX Ver Mensaje
[...] si necesito otra clase, puede ser tambien heredada de la clase conexion, es decir, todas las clases que creo las hago heredadas de la clase conexion ??
Puedes tener N clases que hereden de la clase padre, pero si las instrucciones de los métodos están relacionadas, lo ideal es que crees una clase que abstraiga todas esas funcionalidades. Por ejemplo, si tienes ocho métodos distribuidos en N clases que interactúan con la base de datos, para que no te entreveres con tantas clases y métodos, puedes tener a esos ocho métodos en la misma clase.

Lee sobre el patrón singleton.

Un saludo
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: class, fuera, function, includes, mysql
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 19:32.