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

sobrecarga metodos, strict error

Estas en el tema de sobrecarga metodos, strict error en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, acudo ya que se me da el siguiente caso, tengo este codigo: Código PHP: class  A {     public function  metodo1 ( $parametro1 ,  $parametro2 ) ...
  #1 (permalink)  
Antiguo 10/10/2011, 14:39
 
Fecha de Ingreso: octubre-2011
Mensajes: 37
Antigüedad: 13 años, 2 meses
Puntos: 9
sobrecarga metodos, strict error

Buenas,
acudo ya que se me da el siguiente caso, tengo este codigo:

Código PHP:
class A
{
    public function 
metodo1($parametro1$parametro2)
    {
    }
}

class 
extends A
{
    public function 
metodo1(array $parametro1A $parametro2)
    {
    }

antes de nada, uso PHP 5.3.5
como se puede comprobar sobrecargo el metodo 'metodo1' y le cambio el tipo a recibir, A->metodo1 puede recibir cualquier tipo, sin embargo en B->metodo1, $parametro1 debe ser un array y $parametro2 un objeto de clase A, mi duda viene cuando ejecuto que recibo un STRICT STANDARDS que me comenta que el metodo de la clase hija debe ser compatible con el metodo de la clase padre, entiendo todo perfectamente, es mas, con
Código PHP:
error_reporting(E_ALL & ~(E_STRICT)); 
puedo omitir esos errores, pero sigo sin tener claro si es correcto lo que estoy haciendo, pensaba que PHP5 daba soporte a este tipo de cosas...
que opinais, aver si me abris la cabeza...
  #2 (permalink)  
Antiguo 10/10/2011, 15:02
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 4 meses
Puntos: 1532
Respuesta: sobrecarga metodos, strict error

en php no existe la sobrecarga tradicional además lo que estás haciendo es un reemplazo/sobreescritura y la misma ha de contener la misma estructura, más no una sobrecarga

PD: la unica forma de implementar sobrecarga de métodos en PHP es a travez de los magic methods como __call http://www.php.net/manual/es/languag...oading.methods
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 10/10/2011, 15:23
 
Fecha de Ingreso: octubre-2011
Mensajes: 37
Antigüedad: 13 años, 2 meses
Puntos: 9
Respuesta: sobrecarga metodos, strict error

buenas, primero gracias por contestar, segundo, me he equivocado llamandole sobrecarga, quiero reemplazar/sobreescribir el metodo añadiendo esa restriccion en los parametros, es posible?

pd: conozco el metodo __call, pero si miras bien el contexto del ejemplo creo que se entiende que no busco eso, sino hacer una restriccion al recibir los parametros para que sean unicamente de ese tipo, voy a extender el ejemplo a ver si se entiende mejor:

Código PHP:
class Anillo{}
class 
Boligrafo{}

class 
Coleccion
{
    public function 
agregar($objeto)
    {
    }
}

class 
ColeccionDeAnillos
{
    public function 
agregar(Anillo $objeto)
    {
    
parent::agregar($objeto);
    }
}

class 
ColeccionDeBoligrafos
{
    public function 
agregar(Boligrafo $objeto)
    {
    
parent::agregar($objeto);
    }

muchas gracias

Última edición por loluchis; 10/10/2011 a las 15:28
  #4 (permalink)  
Antiguo 10/10/2011, 15:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: sobrecarga metodos, strict error

Entiendo lo que quieres hacer pero no, PHP no lo soporta, lo que puedes hacer es definir una interfaz genérica y bajo esta heredar las clases que necesitas:
Código PHP:
Ver original
  1. interface Collectable {}
  2.  
  3. class Anillo implements Collectable {}
  4. class Boligrafo implements Collectable {}
  5.  
  6. class Coleccion {
  7.       public abstract function agregar(Collectable $item);
  8. }
  9.  
  10. class ColeccionDeAnillos {
  11.       public function agregar(Anillos $item) {}
  12. }
  13.  
  14.  
  15. class ColeccionDeBoligrafos {
  16.       public function agregar(Boligrafo $item) {}
  17. }

Saludos.
  #5 (permalink)  
Antiguo 10/10/2011, 15:31
 
Fecha de Ingreso: octubre-2011
Mensajes: 37
Antigüedad: 13 años, 2 meses
Puntos: 9
Respuesta: sobrecarga metodos, strict error

tus p*l*t*s, gracias crack ;)

es que vengo de .net (c#, vb) y java...
  #6 (permalink)  
Antiguo 10/10/2011, 15:38
 
Fecha de Ingreso: octubre-2011
Mensajes: 37
Antigüedad: 13 años, 2 meses
Puntos: 9
Respuesta: sobrecarga metodos, strict error

una ultima pregunta, respecto a la nomenclatura de las interfaces, como bien sabeis que vengo de c#, etc... lo estandar seria ICollectable? es que segun veo en la referencia de PHP no usan esa I de interface, sabeis donde puedo encontrar un documento con buenas practicas y estandares de nomenclatura PHP buenos y bien definidos?
  #7 (permalink)  
Antiguo 10/10/2011, 15:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: sobrecarga metodos, strict error

Hay varios, yo el que personalmente uso es: http://framework.zend.com/manual/en/...-standard.html

Saludos.
  #8 (permalink)  
Antiguo 10/10/2011, 16:17
 
Fecha de Ingreso: octubre-2011
Mensajes: 37
Antigüedad: 13 años, 2 meses
Puntos: 9
Respuesta: sobrecarga metodos, strict error

perdona amigo, estoy teniendo problemas, te explico la situacion, antes que nada, he copiado y pegado el ejemplo y funciona ala perfeccion, pero este es mi caso:

tengo la siguiente estructura de directorios

system
-coleccion.php
-coleccionable.php
app
-anillo.php
-coleccion_anillos.php
index.php con autoloader

use namespaces y un autoloader registrado con spl_autoload_register

puede que no me este cargando las interfaces y tenga que incluirlas manualmente?

gracias y un saludo.

EDIT: pues mira en el ultimo ejemplo que has posteado, el que habia probado, me he dado cuenta que las clases no extienden de Coleccion, por lo tanto las he extendido y el mismo error STRICT STANDARDS, ya estoy pensando que la solucion sera una clase y no una interface, estoy en lo correcto?

Última edición por loluchis; 10/10/2011 a las 16:34
  #9 (permalink)  
Antiguo 10/10/2011, 17:39
 
Fecha de Ingreso: octubre-2011
Mensajes: 37
Antigüedad: 13 años, 2 meses
Puntos: 9
Respuesta: sobrecarga metodos, strict error

definitivamente desistiendo...
referencia de php: [URL="http://www.php.net/manual/en/language.oop5.interfaces.php"]Object Interfaces[/URL] [URL="http://php.net/manual/en/language.oop5.typehinting.php"]Type Hinting[/URL]

me he puesto a investigar para mi y para los que vengan detras y aquí me he encontrado con estos dos usuarios aclarando lo siguiente:

cyrille.berliat[no spam]free.fr
Código PHP:
Interfaces and Type Hinting can be used but not with Inherintance in the same time :

<?

class AbstractClass
{ public function __ToString ( ) { return 'Here I\'m I'; } }

class 
DescendantClass extends AbstractClass{}

interface 
MyI
{
    public function 
Hello AbstractClass $obj );
}

class 
MyClassOne implements MyI
{
    public function 
Hello AbstractClass $obj )
    {
        echo 
$obj;
    }
// Will work as Interface Satisfied

class MyClassTwo implements MyI
{
    public function 
Hello DescendantClass $obj )
    {
        echo 
$obj;
    }
// Will output a fatal error because Interfaces don't support Inherintance in TypeHinting

//Fatal error: Declaration of MyClassTwo::hello() must be compatible with that of MyI::hello()

?>
nicholas at nicholaswilliams dot info
Código PHP:
Please note that the following will not work:

<?php

abstract class Object
{
    public abstract function 
toString( );
    public abstract function 
equalsObject &$o );
}

class 
Chair extends Object
{
    public function 
toString( )
    {
        return 
'This is a chair.';
    }
   
    public function 
equalsChair &$o )
    {
        return 
TRUE;
    }
}

class 
Table extends Object
{
    public function 
toString( )
    {
        return 
'This is a table.';
    }
   
    public function 
equalsTable &$o )
    {
        return 
TRUE;
    }
}

$chair = new Chair();
$table = new Table();

echo 
$chair->equals$table );

?>

The expected output is "Fatal error: Argument 1 passed to Chair::equals() must be an instance of Chair, called in [filename] on line 38 and defined in [filename] on line 16" but instead you get "Fatal error: Declaration of Chair::equals() must be compatible with that of Object::equals() in [filename] on line 20".

This is unlike other OO languages (secifically Java) which not only allow but expect this type of code. It is in the nature of abstraction. However, you can get similar results using the following code instead:

<?php

abstract class Object
{
    public abstract function 
toString( );
    public abstract function 
equalsself &$o );
}

class 
Chair extends Object
{
    public function 
toString( )
    {
        return 
'This is a chair.';
    }
   
    public function 
equalsself &$o )
    {
        return 
TRUE;
    }
}

class 
Table extends Object
{
    public function 
toString( )
    {
        return 
'This is a table.';
    }
   
    public function 
equalsself &$o )
    {
        return 
TRUE;
    }
}

$chair = new Chair();
$table = new Table();

echo 
$chair->equals$table );

?>

This code gives the expected result "Fatal error: Argument 1 passed to Chair::equals() must be an instance of Chair, called in [filename] on line 38 and defined in [filename] on line 16". This is the proper behavior but isn't the most intuitive approach for those of us used to OO programming.

Hope this helps someone :-).

Nicholas
nicholas nos propone un segundo metodo, pero que en este caso no sirve, una pena... PHP ya puede mejorar la OOP si no vuelvo a ASP jejeje, noooo me ha gustado mucho el cambio, lamentablemente de un lenguaje nativamente estructurado no me puedo esperar mas, en definitiva, si a la coleccion de anillos le pasan un collar o una pulsera pues los almacenara.... asi que ni coleccion de anillos ni coleccion de coches, ni de nada, coleccion a secas y ya esta..

saludos amigos

PD: aun tengo esperanzas de que alguien venga con el metodo... o habra que esperar a PHP 5.4 y la mejora del Type Hinting
  #10 (permalink)  
Antiguo 10/10/2011, 19:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: sobrecarga metodos, strict error

Cierto, tienes razón no funciona como lo esperas, no se si haya un bug abierto al respecto, pero podrías reportarlo.

Saludos.

Etiquetas: metodos, sobrecarga
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 13:26.