Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Delegate functie mogelijk? Hoe moet ik dit aanpakken?

Pagina: 1
Acties:

Onderwerpen


  • GewoonWatSpulle
  • Registratie: Oktober 2009
  • Laatst online: 10:48
Ik ben uit professie een .NET ontwikkelaar en daar maken we gebruik van de pracht constructie van delegate-functies, een blackbox kan deze aanroepen wanneer er iets gebeurt en voert dan jouw ingegeven code uit.

PHP:
1
2
  $page = new Page();
  $page->FinishedLogics = new function { echo 'yay ik ben klaar'; };


Als het Page object $page klaar is voert hij de bovenstaande functie uit en echo't:
yay ik ben klaar
Mocht de pagina nooit goed laden, dan voert hij de functie niet uit.

Weet iemand een mooie constructie voor dit "probleem" van gebrek aan delegate-functies in PHP?

Ik heb al gekeken naar een wikipedia: Observer-pattern maar vond dat ook niet de mooiste oplossing voor dit probleem.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
http://php.net/manual/en/function.call-user-func.php :?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Foo {
  private $_delegate;

  public function SetShoutFunction($delegate) {
    $this->_delegate = $delegate;
  }

  public function Shout($text) {
    call_user_func($this->_delegate, $text);
  }
}

class Bar {
  public function EchoShout($text) {
    echo $text;
  }
}

$y = new Bar();

$x = new Foo();
$x->SetShoutFunction(array($y, 'EchoShout'));
$x->Shout('W00t!');

Misschien ietwat omslachtig, maar ik denk dat je als .Net ontwikkelaar hier 't snelst herkent wat er gebeurt.

[ Voor 89% gewijzigd door RobIII op 11-11-2011 17:41 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • GewoonWatSpulle
  • Registratie: Oktober 2009
  • Laatst online: 10:48
Kan inderdaad, staat ook op stackoverflow.com: Something like a delegate function in php maar is het ook nog niet helemaal vind ik.

Ik wil even kijken waar deze discussie als alternatief naar kan leiden!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Hey; ik ben geen PHP-er :P

Daarbij heeft jouw suggestie (hoewel inderdaad mooier) wel wat haken en ogen:
Note: Anonymous functions are available since PHP 5.3.0.

Note: It was not possible to use $this from anonymous function before PHP 5.4.0.
In veel (hosted) omgevingen is PHP < 5.3 aanwezig is mijn (beperkte overigens) ervaring.

[ Voor 9% gewijzigd door RobIII op 11-11-2011 17:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • GewoonWatSpulle
  • Registratie: Oktober 2009
  • Laatst online: 10:48
Lijkt mij inderdaad wel handig om even van 5.3 uit te gaan aangezien dat toch echt de versie is die je zou moeten draaien in de praktijk.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Ik denk dat het aantal keren dat je in een procedurele taal als PHP een anonieme functie binnen classcontext nodig hebt vrij klein is. Maar afgezien van call_user_func en deze nieuwe anonieme functies is er bij mijn weten geen non-deprecated alternatief in PHP voor dit soort constructies.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
While we're on the subject (maar dan voor .Net); misschien leuk om te lezen voor je:
http://geekswithblogs.net...ric-action-delegates.aspx
http://geekswithblogs.net...neric-func-delegates.aspx
NMe schreef op vrijdag 11 november 2011 @ 18:07:
Ik denk dat het aantal keren dat je in een procedurele taal als PHP een anonieme functie binnen classcontext nodig hebt vrij klein is.
Ja, maar als je als .Net-ter aan 't PHP-en gaat is zo'n voorbeeldje wel handig; de procedurele variant wijst zichzelf wel in de documentatie. Nu ben ik geen die-hard PHP-er maar de enige paar gevallen waar ik call_user_func nodig had (en dus geen anonymous functions kon gebruiken) had ik ze nou wél binnen classcontext nodig; en (ook omdat ik over wat regeltjes in de documentatie heen las :P ) daar heb ik toen best even op gepuzzeld :Y). Ik zat maar $this of $x te passen als eerste argument, bleek ik een array($instance, 'methodname') te moeten gebruiken. WTF is dat voor vage constructie denk je dan als je een .Net achtergrond hebt ;) :P

[ Voor 62% gewijzigd door RobIII op 11-11-2011 18:18 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
In php 5.3 kan je geen functie in een propety van je class direct uitvoeren. Dit kan wel (vanaf 5.3 niet in 5.2):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class Page
{
    public $finishedLogics = null;

    public function doSomething()
    {
        $func = $this->finishedLogics;
        $func();
    }
}
$page = new Page();
$page->finishedLogics = function () { echo 'yay ik ben klaar'; };
$page->doSomething();


Logica of een pagina wel of niet goed laad, zul je zelf moeten implementeren. Onderaan een groot try catch blok?

Wil je $page gebruiken doe dan dit:
PHP:
1
$page->finishedLogics = function () use ($page) { echo 'yay ik ben klaar ' . get_class($page); };

[ Voor 13% gewijzigd door ReenL op 11-11-2011 19:20 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

RobIII schreef op vrijdag 11 november 2011 @ 18:13:
WTF is dat voor vage constructie denk je dan als je een .Net achtergrond hebt ;) :P
Dat denk je zonder .NET-achtergrond ook hoor. :+

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • GewoonWatSpulle
  • Registratie: Oktober 2009
  • Laatst online: 10:48
Ik was dit topic even uit het oog verloren maar ik heb een alternatieve oplossing bedacht die ook redelijk netjes is!

PHP:
1
2
$page = new Page();
$page->FinishedLogics();


Is wat er eigenlijk gebeurt in geval van een delegate functie, met wat logica in FinishedLogics(); gepropt.


PHP:
1
abstract class Page{ abstract function FinishedLogics(); }

PHP:
1
class StartPage extends Page{ function FinishedLogics(){ /* doe iets leuks */ } }

[ Voor 4% gewijzigd door GewoonWatSpulle op 17-11-2011 14:12 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Dat is nogal een verschil met een delegate...

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Sowieso kun je een abstracte class niet instantiëren en is het discutabel om het op deze manier te doen in plaats van middels een interface.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • GewoonWatSpulle
  • Registratie: Oktober 2009
  • Laatst online: 10:48
Klopt er word geen Page geinstantieerd maar een StartPage.

De reden waarom ik niet voor een interface ben gegaan is omdat er in de base class Page ook wat logica verscholen zit.

Ik zeg niet dat dit DE oplossing is voor het gebrek aan delegate functies in PHP maar dit is naar mijn bescheiden mening een mooie oplossing voor het "probleem" waar ik mee te kampen had.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Je kan natuurlijk zowel een abstracte class deriven en een interface implementen:
PHP:
1
class StartPage extends Page implements Finalizable { /* ... */ }

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • GewoonWatSpulle
  • Registratie: Oktober 2009
  • Laatst online: 10:48
Hmm goed punt, vanavond nog maar eens een keer alles verbouwen ;)

  • Kajel
  • Registratie: Oktober 2004
  • Laatst online: 09-11 18:41

Kajel

Development in Style

RobIII's manier lijkt een beetje op de Objective-C manier. Als je ontwikkelt voor iOS, kom je het gebruik van delegates ook heel veel tegen. Dit is hoe ik het in PHP zou oplossen, met een half oog kijkend naar Objective-C/iOS:

De interface:
PHP:
1
2
3
4
5
6
7
<?php
interface PageDelegate {
    
    function finishedLoading();

}
?>


De Page class:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
class Page {
    
    private PageDelegate $_pageDelegate;
    
    function setDelegate(PageDelegate $p) {
        $_pageDelegate = $p;
    }
    
    function load() {
        // Do all loading stuff
        
        // and in the end...
        if($_pageDelegate) {
            $_pageDelegate->finishedLoading();
        }
    }
}
?>


De class die de delegate functie gaat bevatten:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class SomeController implements PageDelegate {
    
    function pageAction($request) {
        $page = new Page();
        $page->setDelegate($this);
    }
    
    function finishedLoading() {
        echo "It's done!";
    }
    
}
?>

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 21:58
NMe schreef op vrijdag 11 november 2011 @ 18:07:
Ik denk dat het aantal keren dat je in een procedurele taal als PHP een anonieme functie binnen classcontext nodig hebt vrij klein is. Maar afgezien van call_user_func en deze nieuwe anonieme functies is er bij mijn weten geen non-deprecated alternatief in PHP voor dit soort constructies.
Lithium van wat ik heb gezien is het idee ongeveer gelijk aan Node.JS, een anonieme functie voor vanalles dmv callbacks.

Obj-C "sprinkelt" delegation ook overal overheen idd.

[ Voor 4% gewijzigd door ZpAz op 18-11-2011 20:19 ]

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

ZF2 heeft een eventmanager: http://mwop.net/blog/266-Using-the-ZF2-EventManager Fijn spul.

Aunt bunny is coming to get me!

Pagina: 1