Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Comunicación de clases

Estas en el tema de Comunicación de clases en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, Supongamos que tengo una clase A en el archivo claseA.php Código PHP: class  A {     public  $varA ;   function  loadClassB () {   include ( ...
  #1 (permalink)  
Antiguo 02/06/2007, 08:07
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 5 meses
Puntos: 11
Comunicación de clases

Hola,

Supongamos que tengo una clase A en el archivo claseA.php

Código PHP:
class A
{
    public 
$varA;
 
function 
loadClassB() {
 
include (
'claseB.php');
$B = new B;
$B->setClassA();
 
}
 

instancio un objeto:

$A = new A;

y llamo a su función:

$A->loadClassB();


y tengo otra clase B en otro archivo claseB.php

Código PHP:
class B
{
 
function 
setClassA() {
 
$A->$varA"test";
 
}
 

La cuestión concreta es que desde el objeto instanciado $B (que se encuentra dentro del objeto instanciado $A) no puedo llegar a $A->$varA ya que despues de ejecutarlo como lo ven en el ejemplo no modifica la variable $A->$varA. He probado dentro de la función setClassA usar global $A; pero no sirvió.

Cómo se hace para que desde un objeto instanciado dentro de otro mandar valores al objeto que lo contiene????

Gracias!!
  #2 (permalink)  
Antiguo 02/06/2007, 08:28
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 5 meses
Puntos: 11
Re: Comunicación de clases

La única forma en que veo que funciona es no instanciando el objeto B y no llamar a su función static porque allí ya no se ven los objetos.

Asi funciona:

Código PHP:
class A
{
    public 
$varA;
 
function 
loadClassB() {
 
include (
'claseB.php');
B::setClassA();
 
}
 




claseB.php

Código PHP:
class B
{
 
function 
setClassA() {
 
$this->$varA"test";
 
}
 


Fíjense que de esta forma la el objetop $A es como que "adopta" a la función setClassA y la trata como suya, es por esto que se puede "dentro de la clase B poner $this->$varA.

Algunos se preguntarán: por qué no poner la función dentro de la clase A directamente??

La respuesta es porque realmente (no en este simple ejemplo) la clase B es una extensión de otra y necesito usar todas esas funciones.

Hay alguna otra forma de hacerlo?
  #3 (permalink)  
Antiguo 02/06/2007, 08:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Comunicación de clases

Código PHP:
include ('claseB.php');
class 
A
{
    public 
$varA;
 
    public function 
loadClassB() {
        
$B = new B();
        
$B->setClassA($this);
    }
}

class 
{
    public function 
setClassA(A $A) {
       
$A->varA"test";
    }

  #4 (permalink)  
Antiguo 02/06/2007, 08:53
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 5 meses
Puntos: 11
Re: Comunicación de clases

Gracias GatorV, ya lo estoy probando, ese detalle me estaba volviendo más que loco... locura total.

Por cierto, hace bastante lei que estabas haciendo un framework, lo terminaste? dónde se puede leer algo al respecto?

SAludos, gracias y espero tu respuesta.

Última edición por usermax; 02/06/2007 a las 08:58
  #5 (permalink)  
Antiguo 02/06/2007, 09:11
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 5 meses
Puntos: 11
Re: Comunicación de clases

Funciona perfecto, muchas gracias
Según lo que me contesto gatorV estuve averiguando un poco de teoría (siempre me gusta terner el por qué de cada cosa :/) y eso se llama "Type Hints" y en este foro encontré esta entrada:

http://www.forosdelweb.com/showthread.php?p=1951067 o pueden leer algo aquí
www.hackingballz.com/manual-php/language.oop5.typehinting.html

Cita:
Alusión de Tipos??
Type Hinting

PHP 5 introduce Type Hinting. Las funciones ahora estan en la capacidad de forzar a que los parametros sean objetos(especificando el nombre de la clase en el prototipo de la función) ó arrays (desde PHP 5.1).


Código PHP:
<?php
// Una clase de Ejemplo
class MyClass
{
/**
* Una función de prueba
*
* El primer parametro debe ser un objeto de la clase OtherClass
*/
public function test(OtherClass $otherclass) {
echo
$otherclass->var;
}


/**
* Otra función de prueba
*
* El primer parámetro debe ser un array
*/
public function test_array(array $input_array) {
print_r($input_array);
}
}

// Otra clase de Ejemplo
class OtherClass {
public $var = 'Hello World';
}
?>

Cuando falla el type hint se produce un error fatal.


Código PHP:
<?php
// Una instancia de cada clase
$myclass = new MyClass;
$otherclass = new OtherClass;

// Fatal Error: Argumento 1 debe ser de la clase OtherClass
$myclass->test('hello');

// Fatal Error: argumento 1 debe ser una instancia de la clase OtherClass
$foo = new stdClass;
$myclass->test($foo);

// Fatal Error: Argumento 1 no debe ser nulo
$myclass->test(null);

// Funciona: imprime Hello World
$myclass->test($otherclass);

// Fatal Error: Argumento 1 debe ser un array
$myclass->test_array('a string');

// Trabaja: Imprime el array
$myclass->test_array(array('a', 'b', 'c'));
?>

Type hinting también trabaja con funciones:


Código PHP:
<?php
// Una clase de Ejemplo
class MyClass {
public $var = 'Hello World';
}

/**
* Una funcion de prueba
*
* El primer argumento debe ser un objeto de la clase MyClass
*/
function MyFunction (MyClass $foo) {
echo
$foo->var;
}

// Trabaja!
$myclass = new MyClass;
MyFunction($myclass);
?>
Siempre se aprende algo nuevo.
Hasta la próxima

Última edición por usermax; 02/06/2007 a las 09:21
  #6 (permalink)  
Antiguo 02/06/2007, 09:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Comunicación de clases

No esta terminado desafortunadamente, aunque ya esta casi listo, no he tenido el tiempo para documentarlo y hacer el sitio web, asi que esta en stand-by.

Saludos.
  #7 (permalink)  
Antiguo 02/06/2007, 09:25
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 5 meses
Puntos: 11
De acuerdo Re: Comunicación de clases

Bueno... estaremos a la espera entonces. Puedes contar conmigo en lo que haga falta.

Saludos y gracias nuevamente!
  #8 (permalink)  
Antiguo 02/06/2007, 09:28
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 5 meses
Puntos: 11
Re: Comunicación de clases

Una cuestión más GatorV...
Si en vez de usar public function setClassA(A $A)
lo hago así public function setClassA(A &$A)

No sa ahorran recursos de memoria?? o es lo mismo...

Si desde un objeto puedo modificar otro entonces concluyo que los objetos son pasados como referencia automáticamente sin usar &.

Última edición por usermax; 02/06/2007 a las 11:06
  #9 (permalink)  
Antiguo 02/06/2007, 13:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Comunicación de clases

Si estas usando PHP5, por defecto los objetos se pasan por referencia, asi que no tienes necesidad de usar &, si usaras PHP4, si necesitas usar &.

Por cierto, lo de Typhint, solo funciona con clases e interfaces, no puedes poner algo asi:
Código PHP:
class {
     public function 
algo( array $input ) {}

Solo te funciona (de acuerdo al manual) con firmas de Clases o con interfaces.

Saludos.
  #10 (permalink)  
Antiguo 02/06/2007, 13:44
(Desactivado)
 
Fecha de Ingreso: diciembre-2006
Mensajes: 529
Antigüedad: 17 años, 5 meses
Puntos: 11
Re: Comunicación de clases

Buen dato amigo!!

Si, tengo php5 asi que es automático.

Muchisimas gracias!
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 20:30.