PHP - Algunas preguntas sobre OOP...

 
Vista:
Imágen de perfil de facundo

Algunas preguntas sobre OOP...

Publicado por facundo (185 intervenciones) el 03/08/2017 17:33:24
Buenas gente, como pueden ver estoy apriendiendo php orientado a objetos, estoy con un ejercicio y hay una cosa que no me sale, me vendria muy bien un poco de su ayuda para poder entender bien el codigo, desde ya muchas gracias. Abajo del codigo les explico que es lo que no sale.. Les pongo todo el codigo para que puedan entenderlo,parece mucho pero no tiene muchas vueltas.
Index.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
<?php
require_once 'Escuela.php';
require_once 'Niño.php';
require_once 'cocheEscolar.php'; ?>
<pre>
<?php
 $niño = new Niño('facu','av2-4252');
 $niño1 = new Niño('fiama','direccion2');
 $niño2 = new Niño('fraco','direccion3');
 $niño3 = new Niño('emilia','direccion4');
 $niño4 = new Niño('martin','direccion5');
 $niño5 = new Niño('maria','direccion7');
 $niño6 = new Niño('juan','direccion8');
 
 $coche1 = new cocheEscolar('barrio1','abc123');
 
if ($coche1->estaLleno()==false) {
 	$coche1->setAlumnoCoche($niño);
 }
 if ($coche1->estaLleno()==false) {
 	$coche1->setAlumnoCoche($niño1);
 }
 if ($coche1->estaLleno()==false) {
 	$coche1->setAlumnoCoche($niño2);
 }
 if ($coche1->estaLleno()==false) {
 	$coche1->setAlumnoCoche($niño3);
 }
 if ($coche1->estaLleno()==false) {
 	$coche1->setAlumnoCoche($niño4);
 }
 if ($coche1->estaLleno()==false) {
 	$coche1->setAlumnoCoche($niño5);
 }
 if ($coche1->estaLleno()==false) {
 	$coche1->setAlumnoCoche($niño6);
 }
  if ($coche1->estaLleno() == true) {
 	echo 'El autobus ya esta lleno <br>';
 }
echo $coche1->buscarNiño('facu');
//var_dump($coche1->getNiños()) ;
echo 'direccion: ';
var_dump($niño->verDireccion());
 
?>
</pre>
cocheEscolar.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
<?php
Class cocheEscolar
{
	private $barrio;
	private $matricula;
	const LIMITE_CAPACIDAD = '5';
	private $alumnos = array();
 
	public function __construct($barrio,$matricula)
	{
		$this->barrio = $barrio;
		$this->matricula = $matricula;
	}
	public function verMatricula()
	{
		return $this->matricula;
	}
	public function estaLleno()
	{
		return $lleno = count($this->alumnos) >= self::LIMITE_CAPACIDAD;
	}
 
	public function setAlumnoCoche($alumno)
	{
		//if (estaLleno() == false) {
				$this->alumnos[] = $alumno;
			//}								
	}
 
	public function getNiños()
	{
		return $this->alumnos;
	}
	public function buscarNiño($nombre)
	{
		foreach ($this->alumnos as $alumno) {
			if ($alumno == $nombre) {
				return 'El alumno/a ' . $alumno . ' esta en el autobus con la matricula "' . $this->matricula . '"<br>';
			}
		}
	}
}
Niño.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
require_once 'Casa.php';
class Niño
{
	private $nombree;
	public function __construct($nombree,$direccion)
	{
		$this->direccion = new Casa($direccion);
		$this->nombree=$nombree;
	}
	public function __toString()
	{
		return  $this->nombree;
 
	}
	public function verDireccion()
	{
		return $this->direccion;
	}
 
}

Bueno, la primer duda me surge en la funcion estaLleno() de la clase cocheEscolar, no entiendo que es "::self", busque info pero no entiendo como relacionarla con esto...Le hice un var_dump a lo que retorna esa funcion y es un booleano, porque boolean? si no hay ningun IF......

Y la segunda pregunta es, en la clase "Niño" tengo la funcion __toString() que me retorna el nombre del niño, y para retornar la direccion tengo la funcion verDireccion() el problema es que si desde el Index.php quiero imprimir la direccion en pantalla con un echo no puedo me tira un error (algo asi como que no puede convertir un objeto en un string)
1
echo $niño->verDireccion();
.. Pero claro, si en el metodo __toString() de la clase Niño retorno la direccion, una vez ejecutado el codigo me tira este error:
Recoverable fatal error: Method Niño::__toString() must return a string value in C:\xampp\htdocs\colegio\cocheEscolar.php on line 39
que no entiendo porque me tira ese error si en la linea 39 de cocheEscolar esta la funcion buscarNiño() que no tiene nada que ver con el metodo __toString() de la clase Niño o si ?

Bueno espero que puedan ayudarme, y si no entendieron bien lo que planteo avisen que lo trato de explicar distinto. Saludos.
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 [abZeroX]
Val: 575
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Algunas preguntas sobre OOP...

Publicado por [abZeroX] (157 intervenciones) el 04/08/2017 04:04:33
Hola facundo, vamos por orden. Con respecto a la primera dudad la palabra reservada self permite hacer referencia a la clase actual, para de esta forma acceder desde dentro de los métodos de dicha clase a aquellas propiedades, constantes y métodos estaticos de esta. Existen otras formas de poder acceder también por ejemplo las siguientes son equivalentes desde dentro de la clase:

1) Usando la constante __CLASS__
1
2
$class = __CLASS__;
var_dump($class::LIMITE_CAPACIDAD);


2) Usando self:
1
var_dump(self::LIMITE_CAPACIDAD);

3) Usando el nombre de la clase;
1
var_dump(cocheEscolar::LIMITE_CAPACIDAD);

4) Usando una variable con el nombre de la clase;
1
2
$my_class = "cocheEscolar";
var_dump($my_class::LIMITE_CAPACIDAD);

El motivo por el cual dicho método retorna un boolean es porque estas evaluando una expresión lógica, es decir se esta pidiendo que compare la cantidad actual de alumnos con el máximo admitido (determinado por la constante LIMITE_CAPACIDAD);
De hecho no es necesario que guardes el resultado de la expresión en una variable directamente puedes retornar el valor así:
1
return count($this->alumnos) >= self::LIMITE_CAPACIDAD;

Con respecto a la segunda duda, el método mágico __toString() permite a una clase decidir cómo comportarse cuando se le trata como un string.

En el caso de la clase niño a tener un objeto un hacer un
1
echo $nino;
este devolvera el nombre del niño ya que tienes implementado dicho método con el código correspondiente.
Pero en el caso de la dirección, al ser esta un objeto de la clase Casa y no tener implementada el método __toString() arrojara un error fatal E_RECOVERABLE_ERROR.

Documentación oficial: http://php.net/manual/es/language.oop5.magic.php#object.tostring

Espero te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de facundo

Algunas preguntas sobre OOP...

Publicado por facundo (185 intervenciones) el 04/08/2017 04:43:33
Gracias por tu respuestas dudas resueltas!! saludos
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