[php] Functionaliteit van een class veranderen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Ik heb in Wordpress een plugin van een 3e partij die ik niet kan aanpassen (ivm updates), maar daarin zit een class die een keiharde string met een melding uitpoept. Dat keiharde moet wat minder, want is het Engels en het moet Nederlands worden.

De makkelijke weg is die string aanpassen, maar zoals gezegd, ik kan die plugin niet aanpassen ivm updates. Het ziet er ongeveer zo uit:
PHP:
1
2
3
class Foo extends Bar {
  public function fire() { print "problem?"; }
}

Pretty straightforward. Maar dat "problem?" moet iets anders worden. Nu de vraag hoe ik dat voor elkaar ga krijgen. Met een globale functie lukt het wel, maar het is geen globale functie.

Ik ben niet zo gedreven met PHP, maar wel met javascript, dus ik probeer al snel dit soort constructies:
PHP:
1
2
Foo::fire = function() { ... };
Foo->fire = function() { ... };

Dit werkt natuurlijk niet, omdat PHP niet dynamisch is. Ook de class opnieuw declareren geeft een error (dat ie een class niet kan herdclareren).

Ik kan overigens de class wel extenden en die fire() opnieuw maken in de extend, maar daar schiet ik niets mee op, want de aanroepende code gebruikt dan mijn nieuwe class nog steeds niet, want dat zit ook in die plugin.

Dus, uhm, hoe doe je zoiets??

日本!🎌


Acties:
  • 0 Henk 'm!

  • Beatboxx
  • Registratie: April 2010
  • Laatst online: 26-10-2022

Beatboxx

Certified n00b

Kan je niet gewoon het bestand dat je upload aanpassen, of denk ik dan te simpel:S?

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:33

MueR

Admin Tweakers Discord

is niet lief

PHP hoort in Programming

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Het is niet mogelijk om deze bestaande klasse aan te passen, zonder het bestand daadwerkelijk aan te passen. Je zou er een afgeleide (overervende) klasse van kunnen maken, maar dan nog zal de plugin altijd de originele klasse en haar methodes gebruiken.

Wat je voor dit soort problemen kunt doen; neem contact op met de auteur van de plugin of hij multi-language ondersteuning in wil bouwen. Er is een speciaal systeem voor, met vertaalbestanden, dat je daarvoor kunt gebruiken. Sowieso een nettere manier dan een string hard echo'en. :)
Beatboxx schreef op dinsdag 08 februari 2011 @ 20:04:
Kan je niet gewoon het bestand dat je upload aanpassen, of denk ik dan te simpel:S?
Dat kan uiteraard wel, maar de updates van plugins - die automatisch door WordPress uitgevoerd kunnen worden - overschrijven dan vervolgens deze wijzigingen. Dan kun je dus na elke update, weer die wijzigingen door gaan voeren. Niet echt gewenst, helaas... :/

[ Voor 37% gewijzigd door Verwijderd op 08-02-2011 21:08 ]


Acties:
  • 0 Henk 'm!

  • vriesdude
  • Registratie: Februari 2002
  • Laatst online: 13-09 08:52
Volgens mij zou dit moeten kunnen met runkit_method_redefine. Hiervoor moet je wel PECL runkit extension installeren.

* vriesdude vraagt zich af of er echt geen betere oplossing is

/dev/null


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op dinsdag 08 februari 2011 @ 21:05:
Wat je voor dit soort problemen kunt doen; neem contact op met de auteur van de plugin of hij multi-language ondersteuning in wil bouwen. Er is een speciaal systeem voor, met vertaalbestanden, dat je daarvoor kunt gebruiken. Sowieso een nettere manier dan een string hard echo'en. :)
Dit moet de TS sowieso doen, ongeacht of er een vieze hack gevonden wordt.

Mijn idee voor een tijdelijke hack: Altijd alle output bufferen, en een str_replace() doen, waarbij je voor de needle gewoon die functie aanroept, zodat je in ieder geval niet zelf dezelfde string hardcoded hoeft te hebben. :r

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Kun je niet iets doen in de zin van

code:
1
2
3
4
class FooWrapper extends Foo 
{
 public function fire() { print "Problemen mee ?"; } 
}



* vraag me wel af waarom er uberhaupt een het method wordt gedefineerd voor het printen van een string die niet eens te definieren is.

als dit wel zo zou zijn zou het toch makkelijker kunnen.

code:
1
2
3
4
5
class Foo
{
 public $message_problem = 'Probleem?';
 public function fire() { print $this->message_problem; } 
}

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Tenzij die plugincode overal ook de classname hardcoded heeft. Bijv. $instance = new Foo(). Dan heb je niets aan al je subclasses. ;)

{signature}


  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
Persoonlijk zou ik een documentje of zo bijhouden met de engelse termen en de nederlandse vertaling en bij elke update even find replace doen. (argh. handwerk?!) 1 minuut werk. Minder dan een topic starten in tweakers. :)

Verwijderd

Voutloos schreef op woensdag 09 februari 2011 @ 15:33:
Tenzij die plugincode overal ook de classname hardcoded heeft. Bijv. $instance = new Foo(). Dan heb je niets aan al je subclasses. ;)
En reken maar dat WordPress plugins dat doen...
BazzPsychoNut schreef op donderdag 10 februari 2011 @ 16:49:
Persoonlijk zou ik een documentje of zo bijhouden met de engelse termen en de nederlandse vertaling en bij elke update even find replace doen. (argh. handwerk?!) 1 minuut werk. Minder dan een topic starten in tweakers. :)
Dus jij zou ook elke keer als de lekkende gootsteen een plasje water voor je aanrecht had gemaakt, de dweil pakken en het opruimen? In plaats van dat je één keer wat meer tijd er voor vrijmaakt en de lekkende gootsteen maakt? :X

[ Voor 20% gewijzigd door Verwijderd op 10-02-2011 17:01 ]


  • DexterDee
  • Registratie: November 2004
  • Laatst online: 01:47

DexterDee

I doubt, therefore I might be

De functionaliteit die je beschrijft heet in programmeerjargon Monkey Patching en wordt helaas door PHP < 5.3 niet ondersteund, behoudens het installeren van third party extensions die je zelf naar alle waarschijnlijkheid moet compilen.

Vanaf PHP 5.3 zijn er wel gelimiteerde mogelijkheden om functies runtime te herdefiniëren met behulp van de nieuw geïntroduceerde namespaces. Het open source project Patchwork biedt code die dit mogelijk maakt, zonder gebruik te maken van externe extensies. Of dit je probleem kan oplossen weet ik niet, maar het is wellicht de moeite waard om uit te proberen.

Klik hier om mij een DM te sturen • 3245 WP op ZW


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Namespaces gaan je hier niet redden verklap ik je alvast. :Y)

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class A
{
  function __call($func, $args)
  {
     if (is_callable($this->$func))
       return call_user_func_array($this->$func, $args);
  }
}

$a = new A();
$a->b = function(){echo "ohnoes!";}
$a->b();


En ja, eigenlijk zou iets als runkit gewoon standaard in de php core verwerkt moeten worden.

[ Voor 8% gewijzigd door Verwijderd op 11-02-2011 16:17 . Reden: typo ]

Pagina: 1