PHP - Añadir funcionalidad a una Clase

   
Vista:
Imágen de perfil de Alpanpan

Añadir funcionalidad a una Clase

Publicado por Alpanpan (89 intervenciones) el 16/08/2016 00:03:23
Hola a todos, estoy intentando "evolucionar" en el uso de clases y me encuentro con un problema.
Tengo una clase BD ( Base de Datos), hasta ahora siempre que quiero añadirle funcionalidad, creo una función que hace todo el trabajo, pero me gustaría saber como hacer para:
Teniendo esa clase BD, poder añadirla otra clase que contenga otra serie de funciones, por ejemplo, una clase llamada Actividades, y en ella controlar todo lo que tenga que ver con las actividades introducidas en una base de datos, de manera que pueda compartir la conexión a la misma.

Para que lo entendais, creo que más fácilmente, lo que quiero es poder centralizar varias clases ( Actividades, Miembros, Horarios, ... ) en una lase ( BD ), de tal manera que pueda usar, haciendo solo una $conexión a la base de datos, que sería compartida por todas las clases.
1
2
3
4
$vdc=new BD();
$vdc->Usuarios->funcion();
$vdc->Actividades->funcion();
...

tengo hecho esto
Archivo cls_BD.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class DB
{
	private $servidor="localhost";
	private $puerto ="3306";
	private $bd="xxx";
	private $usuario="yyy";
	private $contra="zzz";
 
	public $conexion;
	public $actividades;
	public $error=false;
	public $mensaje="";
 
 
	function DB()
	{
		$this->conexion = new mysqli($this->servidor, $this->usuario, $this->contra, $this->bd);
		if (mysqli_connect_errno())
		{
			$this->error=true;
			$this->mensaje="No ha sido posible conectar con la base de datos";
		}
		else
		{
			$this->error=false;
			$this->mensaje="Conexión realizada con exito";
		}
	}
}
 
class Actividades extends DB
{
	public function cogeActividades()
	{
		return "Hola";
	}
}
Archivo index.php
1
2
3
4
5
6
7
8
require_once ("cls_BD.php");
	$vdc=new DB();
	if ( $vdc->error )
	{
		 print_r( $vdc->mensaje );
		 exit();
	}
	print_r( $vdc->actividades->cogeActividades());
pero cogeActividades no es reconocida.
sin embargo si cambio
Archivo index.php
1
2
3
4
5
6
7
8
9
10
<?php
	require_once ("cls_BD.php");
	$vdc=new Actividades();
	if ( $vdc->error )
	{
		 print_r( $vdc->mensaje );
		 exit();
	}
	print_r( $vdc->cogeActividades());
?>
Si hace lo que tiene que hacer, pero no es lo yo quiero, pues tendría que definir tantas variables como clases
Espero que me podais ayudar.
Gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip

Añadir funcionalidad a una Clase

Publicado por kip (566 intervenciones) el 16/08/2016 00:42:11
Hola, eso es porque la clase Actividades al momento de hacer extends estas declarandola como hija de la clase BD, entonces la clase hija hereda pero la clase padre no, deberias hacerlo al contrario, es decir la clase Actividades deberia ser la clase padre para que la clase BD sea la hija asi heredara las funciones y estas seran accesibles al momento de crear un objeto definido con clase BD.

Espero haberme explicado.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Alpanpan

Añadir funcionalidad a una Clase

Publicado por Alpanpan (89 intervenciones) el 16/08/2016 00:48:15
Si te has explicado correctamente, pero si tengo más clases como Usuarios, o Colectivos, como la agrego a la clase padre?
Sería poder usar varias clases ( Actividades, Colectivos, Usuarios ) dentro de una ( BD )

Estoy probando esto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class BD
{
	private $servidor="localhost";
	private $puerto ="3306";
	private $bd="xxx";
	private $usuario="yyy";
	private $contra="zzz";
	public $conexion;
	public $error=false;
	public $mensaje="";
 
	public $Actividades;
	public $Colectivos;
 
	function BD()
	{
		$this->conexion = new mysqli($this->servidor, $this->usuario, $this->contra, $this->bd);
		if (mysqli_connect_errno())
		{
			$this->error=true;
			$this->mensaje="No ha sido posible conectar con la base de datos";
		}
		else
		{
			$this->error=false;
			$this->mensaje="Conexión realizada con exito";
			$this->Actividades = new actividades( $this->conexion) ;
			$this->Colectivos = new colectivos( $this->conexion) ;
			echo $this->Colectivos;
		}
	}
}
class actividades
{
	private $conexion="";
	function actividades( $conexion )
	{
		$this->conexion = $conexion;
		echo "ya";
	}
 
	public function cogeActividades()
	{
		return "Hola Actividades";
	}
}
 
class colectivos
{
	private $conexion="";
	function colectivos( $conexion )
	{
		$this->conexion = $conexion;
	}
 
	public function cogeColectivos()
	{
		return "Hola Colectivos";
	}
}
1
2
3
4
5
6
7
$vdc=new BD();
	if ( $vdc->error )
	{
		 print_r( $vdc->mensaje );
		 exit();
	}
	print_r( $vdc->Colectivo);
Pero no puedo acceder a las funciones
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Añadir funcionalidad a una Clase

Publicado por kip (566 intervenciones) el 16/08/2016 01:02:57
Bueno, a ver, la herencia entre clases funciona algo asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Padre {
	public function padreF(){
		echo 'Funcion padre';
	}
}
 
class Hijo extends Padre {
	public function hijoF(){
		echo 'Funcion hijo';
	}
}
 
class Nieto extends Hijo {
	public function nietoF(){
		echo 'Funcion nieto';
	}
}
 
$test = new Nieto;
 
$test->padreF();

El padre hereda sus funcionas a la clase Hijo y la clase Nieto hereda de la clase Hijo, entonces es Nieto quien tendra el acceso a las funciones propias y asi mismo a funciones heredadas de la clase Hijo, como la clase Hijo hereda de Padre entonces por ende la clase Nieto tendra acceso a esas funciones tambien.

Implementalo en tus clases y te funcionara.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Alpanpan

Añadir funcionalidad a una Clase

Publicado por Alpanpan (89 intervenciones) el 16/08/2016 01:09:58
Perfecto, ya lo he pillado. Mi código resultante sería algo así
Archivo cls_BD.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
class BD extends tags
{
	private $servidor="localhost";
	private $puerto ="3306";
	private $bd="xxx";
	private $usuario="yyy";
	private $contra="zzz";
	public $conexion;
	public $error=false;
	public $mensaje="";
 
	function BD()
	{
		$this->conexion = new mysqli($this->servidor, $this->usuario, $this->contra, $this->bd);
		if (mysqli_connect_errno())
		{
			$this->error=true;
			$this->mensaje="No ha sido posible conectar con la base de datos";
		}
		else
		{
			$this->error=false;
			$this->mensaje="Conexión realizada con exito";
		}
	}
}
 
class actividades
{
	private $conexion="";
	function actividades( $conexion )
	{
		$this->conexion = $conexion;
		echo "ya";
	}
 
	public function cogeActividades()
	{
		return "Hola Actividades";
	}
}
 
class colectivos extends actividades
{
	private $conexion="";
	function colectivos( $conexion )
	{
		$this->conexion = $conexion;
	}
 
	public function cogeColectivos()
	{
		return "Hola Colectivos";
	}
}
class tags extends colectivos
{
	private $conexion="";
	function tags( $conexion )
	{
		$this->conexion = $conexion;
	}
 
	public function cogeTags()
	{
		return "Hola Tags";
	}
}
Archivo index.php
1
2
3
4
5
6
7
8
9
10
11
12
<?php
	require_once ("cls_BD.php");
	$vdc=new BD();
	if ( $vdc->error )
	{
		 print_r( $vdc->mensaje );
		 exit();
	}
	print_r( $vdc->cogeActividades());
	print_r( $vdc->cogeColectivos());
	print_r( $vdc->cogeTags());
?>

Muchas gracias, creo que así me valdrá para lo que quiero
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar