php con clases

NeB1

Buenas a todos,

estoy intentando hacer un pequeño proyectillo, pero el código lo más profesional que pueda, ya que el proyecto es relativamente corto, voy cogiendo hábitos, que ya me hacen falta (por eso tantas tonto preguntas esta semana).

Así que allá voy con otra tonto-pregunta:

Tengo una clase user, y otra clase messageStack. la clase messageStack, cada vez que se ejecute un código php, quiero que sea única, y que el resto de las clases, llamen a este objeto, para añadir mensajes de error, o advertencias, un ejemplo.


function __construct( $user, $pass ){
	$query = mysql_query (
							sprintf( " 
								SELECT u.`id`,u.`group_id`,u.`user`, u.`password`, u.`email`, u.`date_registered`, u.`date_last_login`, u.`status`, g.`group_name`
								FROM `user` AS u 
									  LEFT OUTER JOIN `user_groups` AS g 
										ON u.`group_id` = g.`id`
								WHERE `user` = '%s' AND `password` = '%s' LIMIT 1;",
								mysql_real_escape_string($user),
								sha1(mysql_real_escape_string($pass))
							)
						  );
	if( !$query ){
		$message_stack->push( "Error en la consulta a la base de datos, consulte con el administrador", $message_stack->ERROR_MESSAGE );			
	}elseif( mysql_num_rows( $query ) == 0 ) {
		$message_stack->push( "El usuario no existe o la contraseña es incorrecta", $message_stack->ERROR_MESSAGE );
	}else{
		$user = mysql_fetch_array( $query );
		if( !$user['status'] ){
			$message_stack->push( "Usuario deshabilitado", $message_stack->ERROR_MESSAGE );
		}else{
			$this->autentificated = 1;
			$this->uid = $user['id'];
			$this->username = $user['user'];
			$this->email = $user['email'];
			$this->update_date_last_use();
			$this->group = $user['group_id'];
		}
	}
}

como se puede observar, llamo a la pila de mensajes para pushearle un mensaje nuevo, y ahí va el tema, como puedo hacer que $message_stack sea un único objeto para cualquier clase, función o método que quiera hacer uso de ella?

Hay que tener en cuenta que no quiero romper el encapsulamiento, con lo que no me valen variables globales. La otra que prefiero evitar es pasar la variable por referencia en el constructor si pudiese ser, si nos na.

Hay forma de hacer esto?

r2d2rigo

Haz que $message_stack sea un singleton.

NeB1

#2 O_O joder, no lo había visto en mi vida, me siento un poco inútil xD.

Muchas gracias!.

Muy bueno porque el ejemplo que te dice de una conexión a la base de datos, también lo necesitaba :P

BLZKZ

ya que estamos con este tema xD, de momento no me he metido a hacer cosas con clases en php, y me gustaría saber si realmente las clases estan tan extendidas (en uso) como para que sea altamente recomendable hacerlas.

Decir que en OO no soy novato xD simplemente que en php salvo casos contados no he visto la necesidad :S

NeB1

#4 te pasa un poco como a mí, pero no me quería quedar estancado.

En PHP es muy fácil saltarte la necesidad de clases, pero la verdad es que si trabajas en equipos de varias personas, se agradece manejarte con objetos y no con sus funciones y variables por separado.

SiCk

#4 No sólo lo recomiendo, si no que lo considero imprescindible si haces una aplicación con cierto tamaño.
Si sigues cualquier patrón simple, se hace con clases si o si.
Siempre puedes extender (class ejemplo extends clasepadre) y usar las llamadas mágicas (construct, call, destroy...) o usar interfaces (interface ejemplo y luego class ejemplo2 implements ejemplo). En cualquier caso el método más usado es la auto carga de clases de tal manera que puedes llamar a una clase (ya sea instanciando o de manera estática) y se auto carga su correspondiente .php. Y si unes eso al tipo sistema MVC donde es un index el que carga una sección un otra pues consigues hacer aplicaciones muy fácil, escalables y con todo controlado y aparte puedes añadir librerías y usarlas de manera muy simple y eficiente (por ejemplo una clase mysql singleton como os dijeron arriba).
Eso es un uso normal y os aseguro que ahorra quebraderos de cabeza y tiempo.

BLZKZ

una duda, cuando creas un objeto de una clase el objeto lo destruyes tu siempre o se destruye solo al cargar otra página? Es que no se como va esto de la gestión de memoria de php :S

NeB1

#7 se destruye solo

Soltrac

#8 Ojo! no se si te entendido bien, pero aunque la mayoría de proyectos web no necesitan destrucción de objetos fuera de la intrínseca de la clase, hay veces que si será conveniente crear los correspondientes destructores.

B

Php no tiene un "recolector de basura" como java y .net. Se aconseja usar destructores.

BLZKZ

bueno pero neb1 me entendió xD mi pregunta iba encaminada a si un objeto creado en una página seria usable sin hacer más en otra.

NeB1

#10 pero las variables se pierden de una ejecución a otra y se limpia la memoria

#11 eso creo :S

#11 por cierto, si quieres pasar una variable de un script a otro, yo lo hago con $SESSION['variable'] = serialize($objeto); y despues $objeto = unserialize($SESSION['variable'])

LOc0

#10 Ahora sí -> http://www.php.net/manual/es/features.gc.php

Y es posible activarlo/desactivarlo/forzar la limpieza si se necesita rendimiento máximo en determinadas situaciones.

Por cierto, #1, si quieres ir cogiendo buenos hábitos te recomiendo que eches un vistazo a -> http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612

Salu2 ;)

NeB1

#13 vale la pena por 35€?

B

#13 thx, me acabo de enterar y eso que hace poco mire el changelog de la 5.3

BLZKZ

#12 lo de pasarlo por session se me había ocurrido, pero usar serialize no, por cierto lo de #13 te vale para TODO lo que sea programación. En mi universidad hasta este año había un seminario difícil pero práctico sobre patrones de diseño, ya lo quitan por culpa de bolonia, así que me lo miraré por mi cuenta xD

NeB1

#16 lo de serialize era la clave, es que si nos no funciona. (no sé si hay otras formas de hacerlo, así es como lo hago yo)

Usuarios habituales