ugrás a tartalomhoz

Függvény típusú osztálymezők

Fraki · 2007. Jún. 9. (Szo), 05.36
Azt szeretném, hogy egy osztályom default függvényt tartalmazzon egy bizonyos műveletre, amit a példányok felülírhatnak.

Valami ilyesmi alapján csinálnám (ez működik):

function K($x) {
  return $x;
}

$k = K;
echo $k('mokus');

Sajnos osztályban már nem működik:

  class Pager {

    public $delinkify = strip_tags;

    function link($x) {
      // ...

      return $this->delinkify($x);
      // (igy se mukodik:)
      // return ${this->delinkify}($x);
    }

  }
Ha ez a fenti dolog működne, akkor tudnám csinálni ezt:

$pager = new Pager(/* ... */);
$pager->delinkify = create_function(/* ... */);
Csak nem megint a csodálatosan rugalmas php-szintaxis korlátjába ütköztem? Any ötlet?
 
1

Köszöntem

Fraki · 2007. Jún. 9. (Szo), 05.46
Köszöntem, meg van oldva.

  return call_user_func($this->delinkify, $x);
(Mondhatom, nagyon szépen néz ki...)
2

szemleletmod

Hodicska Gergely · 2007. Jún. 10. (V), 20.46
Mondhatom, nagyon szépen néz ki...
Ez nem a nyelv hibaja, rossz szemleletmoddal kozelited meg a problemat. Mit szerettel volna igy megoldani? (Az eleve gyanus, hogy egy konkret peldanyon szeretnel egy metodust megvaltoztatni, rossz tervezesre utal.)


Udv,
Felho
3

Nocsak

Fraki · 2007. Jún. 11. (H), 03.16
Honnan szűrted le, hogy rossz szemléletmód az, ha valaki változó osztálymetódust akar írni??? Callback-függvényekről hallottál már?

Egy lapozó osztályt írtam egyébként, amivel sok itemes oldalak lapozóját lehet könnyen beilleszteni. Az egyik callback metódusa a delinkify, amelyik akkor fut le, ha valamelyik link a lapozón önmagára mutat (például első oldalon az "első" vagy "előző" link). Ez defaultból a strip_tags, de az egyik oldalamon másra volt szükségem (emptyFunction-ra, azazhogy ne jelenjen meg a link). (Ui. kétféle lapozó van a szájton... azt ne mondd, hogy származtassak; nem absztrakt osztálynak szántam, nem akarnék ágyúval verébre módon származtatott osztályokat írogatni ezekre, mikor egy egyszerű paraméterről van szó).

Szvsz komoly szintaxis-probléma az, hogy nem lehet meghívni egy függvény típusú változót, ha az osztálydeklarációban szerepel. Pontosan látszik rajta, hogy utólag van beleheggesztve a nyelvbe az oop. (No meg ide vezet ez a dollárosdi...) Ezzel a caller függvénnyel a dolgot orvosolták, de azért elég csúnya ez.
4

ellentmondás

Hodicska Gergely · 2007. Jún. 11. (H), 04.29
Honnan szűrted le, hogy rossz szemléletmód az, ha valaki változó osztálymetódust akar írni??? Callback-függvényekről hallottál már?
Oké: mutass egy olyan mintát, ahol azt ajánlják, hogy egy példányon tudj felülírni egy metódust. A callback nem erről szól, ott egyszerűen kívülről adsz meg egyfajta függőséget.

azt ne mondd, hogy származtassak; nem absztrakt osztálynak szántam, nem akarnék ágyúval verébre módon származtatott osztályokat írogatni ezekre, mikor egy egyszerű paraméterről van szó
Akkor teheted, amit csináltál, de nem hiszem, hogy ez lenne egy korrekt OOP megoldás.

Szvsz komoly szintaxis-probléma az, hogy nem lehet meghívni egy függvény típusú változót
Az is lehet a probléma, hogy nincs a PHP-ban függvény típusú változó. ;) Amiket próbáltál, abból mindkét verzió nyilvánvalóan nem működhet: az elsőnél meghívod a delinky függvényt, a második meg szintaktikailag hibás. Ami működhetne, az ez: ${$this->bar}();, és ebben igazad van, hogy nem konzekvens a PHP részéről, hogy ezt nem tudja, de akad még pár következetlenség ezen kívül.


Üdv,
Felhő
5

milyen ellentmondás?

Fraki · 2007. Jún. 11. (H), 07.41
Oké: mutass egy olyan mintát, ahol azt ajánlják, hogy egy példányon tudj felülírni egy metódust. A callback nem erről szól, ott egyszerűen kívülről adsz meg egyfajta függőséget.

Milyen mintára gondolsz, és miféle ajánlásra? Nekem nem metódust kell felülírnom, hanem változó függvényt meghívnom. A callbackek erre vannak: változó függvények. Persze, hogy külső függőség, ez min változtat most?

Akkor teheted, amit csináltál, de nem hiszem, hogy ez lenne egy korrekt OOP megoldás.

Még mindig nem értem, miért nem korrekt (és miért fontos, hogy a nagykönyves OOP) megoldás az, ha valaki callback-fv.-t akar implementálni php-ban egy osztályra. Abban talán egyetértünk, hogy a callbackezés egy korrekt valami.

Az, hogy én milyen template-feladatokra milyen skálájú megoldást választok, igencsak esetfüggő. Az én esetemben egy olyan szájtról van szó, ahol kétféle lapozó van, én ezeket általánosítottam egy osztályba, és kényelmes dolog laponként paraméterezve példányosítani, származtatás helyett. A template-rendszerek amúgy tele vannak callback-mechanizmusokkal. A drupal is, csak még sokkal körülményesebb...