Ir al contenido


Foto

Consulta con POO


  • Por favor identifícate para responder
24 respuestas en este tema

#1 surferpio

surferpio

    Newbie

  • Miembros
  • Pip
  • 3 mensajes

Escrito 01 abril 2013 - 10:19

Una consulta tengo una clase y que la llamo de la siguiente manera
$obj = new opcionesModel();
$valPais = $obj->getPais();
$valDep = $obj->getDepartamento();

pero cuando deseo usar los datos de $valDep tambien me saca los de $valPais, en que estoy fallando? o la manera correcta es crear otro objeto de la misma clase llamando otra función?
  • 0

#2 JuanPablo

JuanPablo

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 02 abril 2013 - 12:25

Deberías de mostrar la clase y los métodos para revisar bien el código quisas el error este en el metodo
  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 abril 2013 - 07:02

Yo estoy verde con PHP pero vamos a intentar descubrir tu problema.

¿Dices "que te saca" los datos de la variable $valPais? ¿Podrías explicarnos a que te refieres con "sacar"? ¿Se borran? ¿Se pierden? ¿Se sobreescriben? ¿Se pierde la referencia de la variable provocando una violación o error?

Por favor se más descriptivo de tu problema y da a conocer el código real que utilizas. Como dice JuanPablo, habrá que ver el script de la clase para comprender que sucede efectivamente cuando se invoca a los métodos GetPais y GetDepartamento.

Cuanto más nos puedas comentar sobre el problema más fácil será asesorarte.

Saludos,
  • 0

#4 ghro77

ghro77

    Member

  • Miembros
  • PipPip
  • 15 mensajes

Escrito 03 abril 2013 - 04:51

lo mas optimo es que pongas tu clase y los metodos para poder saber cual es el problema.
  • 0

#5 jonbra

jonbra

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 04 abril 2013 - 09:17

muéstranos tanto la clase como toda la instancia de la clase para saber dónde está el problema
  • 0

#6 porfi.dev

porfi.dev

    Advanced Member

  • Miembros
  • PipPipPip
  • 183 mensajes
  • LocationMy House @ México

Escrito 05 abril 2013 - 01:57

:angel:

NOP el problema es que usas la misma instancia para dos funciones diferentes que retornan valores... siempre te va a encimar los datos.

eso es normal en la POO, no te va a quedar de otra más que:

$obj = new opcionesModel();
$valPais = $obj->getPais();

$obj2 = new opcionesModel();
$valDep = $obj2->getDepartamento();

tranquilo poco a poco dominaras este tema y encapsularas de mejor forma para no tener que recurrir a esto (es decir que en un solo retorno arroje todo lo que necesitaS).
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 abril 2013 - 04:27

Desconozco PHP pero me parece ridículo que deba emplearse otra instancia para leer otros datos. si en verdad es eso es un gravísimo defecto de PHP y no de un problema conceptual y de OO como afirmas
  • 0

#8 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 05 abril 2013 - 04:30

Desconozco PHP pero me parece ridículo que deba emplearse otra instancia para leer otros datos. si en verdad es eso es un gravísimo defecto de PHP y no de un problema conceptual y de OO como afirmas


Es por la forma en que están diseñados los métodos amigo mio. No es problema de php
  • 0

#9 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 05 abril 2013 - 06:10

Desconozco PHP pero me parece ridículo que deba emplearse otra instancia para leer otros datos. si en verdad es eso es un gravísimo defecto de PHP y no de un problema conceptual y de OO como afirmas


Saludos, definitivamente es un problema conceptual o de implementación en los métodos, ya que php al igual que cualquier lenguaje POO serio, sigue los principios de la POO, por tanto lo que plantea el compañero elporfirio NO es cierto, ya que no es necesario crear dos instancias de la clase para llamar a diferentes métodos:

NOP el problema es que usas la misma instancia para dos funciones diferentes que retornan valores... siempre te va a encimar los datos.

eso es normal en la POO, no te va a quedar de otra más que:

$obj = new opcionesModel();
$valPais = $obj->getPais();

$obj2 = new opcionesModel();
$valDep = $obj2->getDepartamento();

tranquilo poco a poco dominaras este tema y encapsularas de mejor forma para no tener que recurrir a esto (es decir que en un solo retorno arroje todo lo que necesitaS).


Una de las cosas que puede estar pasando, es que en el método getDepartamento de la clase opcionesModel, se encuentra el mismo código que del método getPais, posiblemente por un copy/paste o simplemente por descuido.
  • 0

#10 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 06 abril 2013 - 01:17


Una de las cosas que puede estar pasando, es que en el método getDepartamento de la clase opcionesModel, se encuentra el mismo código que del método getPais, posiblemente por un copy/paste o simplemente por descuido.


Creo que es a eso precisamente a lo que se refiere nuestro amigo elporfirio, bueno, eso entendí yo. :)
  • 0

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 06 abril 2013 - 12:51

El asunto es que en ningún momento surferpio ha dado muestra de la implementación de su clase, o al menos de los métodos en cuestión. Entonces es ya un problema de como está diseñada la clase, y que para poder ayudar es fundamental verlo el código. Esto se lo hemos señalado desde el inicio.

Pero el que se diga y asegure que en PHP se debe hacer otra instancia para acceder a otro atributo de una misma clase y que así es la OO es ya un absurdo. Yo desconozco muchísimo de PHP pero debo decir que la afirmación de elporfirio carece de lógica alguna... si hasta incluso va en contra del propio concepto de lo que se conoce como OO. Y dudo muchísimo que PHP intente ir contra la propia teoría de OO... aún cuando tenga sus "tiquismises".

Y lamento decirlo pero Poli, pero si tu también dices que es por una cuestión de como están implementados entonces es casi obvio que ya es un problema de lógica y diseño de la clase (que es el 1er planteo que se le ha dado). Ergo: no es cosa de que "así es como funciona PHP". Por tanto tu respuesta no puede afirmar los dichos de elporfirio.

O es que yo estoy totalmente dormido, aún no me recupero del fuerte dolor de cabeza de ayer y no logro entender las cosas.

Invito nuevamente a surferpio a que exponga el código para lograr llevar el tema a su cause y poder encontrar el error. Porque de seguir así vamos camino a los supuestos y a sacar nuestras bolas de cristal.

Saludos,
  • 0

#12 porfi.dev

porfi.dev

    Advanced Member

  • Miembros
  • PipPipPip
  • 183 mensajes
  • LocationMy House @ México

Escrito 08 abril 2013 - 10:38

No nunca dije que estaba mal, el problema es que los datos se enciman es decir, si tu llamas dos funciones dentro de una misma clase, las cuales retornan valores. esos valores se van sobreescribiendo, el arreglo no se borra hasta que se le indique.

ya sea via unset, o declarando una nueva instancia.

Como tal si es un problema de modelado ;) solo di la solución rápida al problema.
  • 0

#13 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 08 abril 2013 - 10:48

No nunca dije que estaba mal, el problema es que los datos se enciman es decir, si tu llamas dos funciones dentro de una misma clase, las cuales retornan valores. esos valores se van sobreescribiendo, el arreglo no se borra hasta que se le indique.

ya sea via unset, o declarando una nueva instancia.

Como tal si es un problema de modelado ;) solo di la solución rápida al problema.


Exacto amigo, eso entendí de un inicio. Saludos¡¡¡¡¡¡
  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 abril 2013 - 11:34

No nunca dije que estaba mal, el problema es que los datos se enciman es decir, si tu llamas dos funciones dentro de una misma clase, las cuales retornan valores. esos valores se van sobreescribiendo, el arreglo no se borra hasta que se le indique.

ya sea via unset, o declarando una nueva instancia.

Como tal si es un problema de modelado ;) solo di la solución rápida al problema.


A ver... hasta donde llegan mis conocimientos:

$Variable


esto es una variale. Y:

$Variable2


es otra. ¿O no?

Ergo, si yo tengo la instancia de una clase:

$obj = new MiClase();


¿Porqué se debiera de perder el contenido si justamente estoy recuperando/leyendo los datos desde atributos o métodos diferentes para cada variable?:

$variable = $obj->DameUnDato();
$variable2 = $obj->DameOtroDato();


En $variable y en $variable2 no debiera haber motivo alguno que sospecha para que se hayan sobrescrito una por la otra... A menos que intencionalmente se haga un buen guisado dentro de la implementación, y por dentro en el código que tiene surferpio esté regresando justamente lo mismo.

No encuentro lógica en tus palabras, asi de secas con semejante supuestos. Son dos variables diferentes, para cosas diferentes. A menos, de nuevo, que efectivamente así es PHP (y que afirmaste son temor a dudas... fíjate como te has expresado al decir que SIEMPRE es así) y no respeta las buenas prácticas de programación y no es capaz de entender la correcta separación de variables y que deba emplearse ¡otra instancia!  :o

¿Que acaso no es capaz de entender algo, que por ejemplo en Delphi es tan sencillo?



delphi
  1. var mivar1, mivar2: integer;
  2. obj: TMiClase;
  3. ....
  4. obj := TMiClase.Create;
  5. mivar1 := TMiClase.GetDatoParaMiVar;
  6. mivar2 := TMiClase.GetOtroDatoParaMiVar2;



Y que, no... no es posible... en PHP te vas a pisar si haces eso.  ^o|

Si en todo caso hacemos el supuesto de que efectivamente surferpio ha escrito correctamente la implementación para sus métodos y viene aquí justamente por este extraño comportamiento. Aún así ¿Lo seguirías afirmando?

Nuevamente, después de este análisis, llego a dos conclusiones:
1) Es cosa de que efectivamente PHP no entiende de variables e instancias. Por tanto así es como funciona PHP. (*) O bien,
2) Hay algo mal en la implementación del método. Que es distinto a asegurar de que siempre va a pasar porque así es la POO en PHP.

(*) Y aquí como pregunta bonus: ¿Entonces como se le hace para tener un grupo de instancias de una misma clase, cada una con sus propios datos?

Sea cual fuese la elección, me parece que haberlo asegurado tan abiertamente de que NECESARIAMENTE la solución (y por tanto la ÚNICA... por el "SIEMPRE") por la cual debiera de DECANTARSE es algo muy apresurado. ¿No crees?

Por favor, entonces, invito a los que saben de PHP a que expliquen entonces que es lo que en verdad está pasando aquí. Porque lo que veo es que se sigue jugando con una bola de cristal.

Saludos,
  • 0

#15 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 08 abril 2013 - 11:48



Sea cual fuese la elección, me parece que haberlo asegurado tan abiertamente de que NECESARIAMENTE la solución (y por tanto la ÚNICA... por el "SIEMPRE") por la cual debiera de DECANTARSE es algo muy apresurado. ¿No crees?

Por favor, entonces, invito a los que saben de PHP a que expliquen entonces que es lo que en verdad está pasando aquí. Porque lo que veo es que se sigue jugando con una bola de cristal.

Saludos,



Delphiius, no veo por que te es tan dificil comprender lo que está sucediendo con el código del amigo. Pero si está clarisimo¡¡¡¡¡¡¡¡¡¡



dado que

$reultado1 = $Clase->metodo1();
$reultado2 = $Clase->metodo2();

$reultado1 === $resultado2

solo puede deberse a una cosa¡¡¡¡¡¡¡¡¡¡¡

que dentro de método1 y método2 se está usando la misma propiedad de la clase para devolver el resultado.......

es decir que dentro de método1 y método2 se hace uso de $this->propiedadarreglo para devolver el valor en ambos métods.

no veo dónde está lo complejo de esto. :-| si tanto elporfirio como yo lo entendimos claramente y hemos insistido que es error de diseño no del lenguaje ni del paradignma
  • 0

#16 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 abril 2013 - 12:00

El punto es muy claro Poli. Como he dicho, estamos haciendo supuestos... no hay nada seguro. Hasta que surferpio regrese con novedades.

Fíjate en que como los primeros intervenientes, incluído yo, hemos pedido que nos aporte más detalles es porque deseamos evitar sacar una bola de cristal.

Luego, el que ustedes aseguren que LA SOLUCION es declarar otra instancia (que desde mi punto de vista es absurdo si no hay alguna necesidad de ello) ya que ASEGURAN de que dentro de su implementación hay algo raro.

De aquí es que vengo con el debido pedido de aclaración. Porque he dicho de que si mantenemos el supuesto (utilizo la misma jugada de ustedes) de que surferpio ha hecho bien las cosas en sus implementaciones y ha visto tal extraño suceso y por ello pregunta ¿entonces tiene sentido tal propuesta de parte de elporfirio?

No tengo nada en contra de elporfirio sino que me parece muy suelto y esquivo en dar una mejor situación y explicación del caso y con un planteo que más que soluciones nos trae más dudas.

Saludos,
  • 0

#17 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 08 abril 2013 - 12:08


Luego, el que ustedes aseguren que LA SOLUCION es declarar otra instancia (que desde mi punto de vista es absurdo si no hay alguna necesidad de ello) ya que ASEGURAN de que dentro de su implementación hay algo raro.


Bueno, si dado lo siguiente:


 
  $resultado1 = $Clase->metodo1();
  $resultado2 = $Clase->metodo2();

  print_r($resultado2); // Contiene valores de resultado1




se deduce claramente por lógica que ambos métodos están usando una misma variable que pertenece a la clase para armar el return. Entonces se propone derivado de ello la siguiente solución, que se aclaró arriba solventa el error de diseño




  $Clase = new Taclase(); 
  $resultado1 = $Clase->metodo1();
  $Clase = new Taclase();
  $resultado2 = $Clase->metodo2();

  print_r($resultado2); // Contiene solo valores de resultado2



e  insisto, es lo que desde un inicio se ha planteado. :) pero coincido contigo, esperemos a que el amigo comparta el código de su clase que aquí armamos debate ya sobre su pregunta y el susodicho no se ha molestado en siquiera decirnos si le funcionó lo propuesto por el amigo porfirio.


  • 0

#18 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 abril 2013 - 12:09

no veo dónde está lo complejo de esto. :-| si tanto elporfirio como yo lo entendimos claramente y hemos insistido que es error de diseño no del lenguaje ni del paradignma

Pues en realidad en las primeras palabras de elporfirio claramente dicen que es porque asi es normal en la POO, ergo: es cosa del paradigma. Lo cual como sabemos... no es cierto.

Aún cuando sus respuestas sean certeras, está dando una información equivocada y confusa de lo que es en realidad y en como funcionan las cosas en la OO. Ergo: si se transmite un mensaje confuso de lo que se entiende sobre el paradigma, cualquier lenguaje LOO también adolece de lo mismo.
Entonces:
1) O es cosa del lenguaje
2) O es cosa de un pequeño desliz de uno

Sea cual sea. En las palabras de elporfirio hay un mensaje confuso. ;) Espero que ahora se entienda el punto.

Saludos,
  • 0

#19 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 08 abril 2013 - 12:17

Pues en realidad en las primeras palabras de elporfirio claramente dicen que es porque asi es normal en la POO, ergo: es cosa del paradigma. Lo cual como sabemos... no es cierto.


Creo que ya dí con el embrollo, haces referencia a

NOP el problema es que usas la misma instancia para dos funciones diferentes que retornan valores... siempre te va a encimar los datos.

eso es normal en la POO, no te va a quedar de otra más que:


creo que más bien fué un problema de ´redacción que dió pie a la discusión, yo entendí al leer esto que elporfirio le decia que el problema estaba en la propiedad de la instancia, no en la instancia en sí, y consideré atinada la rsupuesta. Claro que ateniendonos a que si se hiciera referencia a la instancia de la clase en sí, pues es algo errado.

caemos ahí si en el campo de la especulación.
  • 0

#20 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 abril 2013 - 12:28

¡Por fin se me entiende!  :
¿Ven lo que se puede hacer si no se lee y se da tiempo para explicar mejor las cosas? En aras de dar una "extraña" respuesta con una posible solución se ha puesto en un escenario confuso lo que se se entiende de un lenguaje tan usado y de la teoría misma que está detrás.

Si ya tanto bigleaguer como yo ya habíamos detectado el confuso escenario planteado (encima yo... un desconocedor de PHP) Y queríamos señalarlo. Y debo decir que me ha extrañado de ti que no lo hayas detectado tal confusión... sabiendo que te desenvuelves y te sabes defender muy bien en PHP.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.