[PHP] OO probleem met functie buiten object

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Hoi,

Ik heb de volgende functie geschreven:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
#try to include custom file else normal file-------------------------------------------------------
function custom_include( $filename ) {
    
    #init
    global $_paths;

    #try to include custom file
    if ( is_readable($_paths['web_root'] . "_custom/" . $filename) ) { include($_paths['web_root'] . $_paths['custom'] . "/" . $filename); }

    #try to include normal file
    elseif ( is_readable($_paths['web_root'] . $filename) ) { include($_paths['web_root'] . $filename); }

}


Zoals je ziet is het doel om bij een include eerst te checken of er een custom versie van bestaat, en zoja die te gebruiken. Als de custom versie niet bestaat probeert ie het standaard bestand te includen.

Deze functie staat in index.php zodat ie altijd beschikbaar is zonder globals te hoeven gebruiken. Ik gebruik de functie onder andere voor het inlezen van config bestanden. Een config bestand ziet er bij mij doorgaans uit als:

code:
1
2
3
$this->settings['toon_banner'] = true;
$this->settings['toon_zoek'] = false;
...


en wordt geinclude door classes (objecten).

Probleem is dat de config file, als deze wordt uitgevoerd middels mijn eigen custom_include ipv include, hij $this niet kent. Hij zit dus buiten de class. Hoe los ik dit op?

Acties:
  • 0 Henk 'm!

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Uh niet op deze manier.
Wanneer je deze functie geen onderdeel maakt van een class kun je nooit $this aanroepen.

Je zou met een singleton kunnen werken echter dat is niet het mooiste alleem kun je dan ipv $this overal $instance = singleton::getInstance(); gebruiken

Acties:
  • 0 Henk 'm!

  • Exception
  • Registratie: Augustus 2006
  • Laatst online: 17-09 11:10
Door inplaats van $this de variable waarmee je de class hebt gedefineerd te gebruiken.

PHP:
1
2
3
$dezeclass = new MijnClass();

$dezeclass->settings['toon_banner'] = true;

Of begrijp ik je nu verkeerd?

[ Voor 7% gewijzigd door Exception op 20-07-2008 10:55 ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:51

Haan

dotnetter

Ik weet niks van PHP, maar normaal gesproken roep je met het keyword 'this' iets aan vanuit een object op het object zelf, bijvoorbeeld this.DoSomething(), wil je van 'buiten' iets in het object aanroepen, dan wordt het myObject.DoSomething(). (waarbij je dus wel eerst een object genaamd 'myObject' hebt aangemaakt!)

Misschien helpt dit.
edit:
en alweer te laat :P ik zeg hetzelfde als Jeff van Hees hierboven

[ Voor 9% gewijzigd door Haan op 20-07-2008 10:58 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
@Jeff & @Haan: De settings file weet natuurlijk niet met welke naam zijn class wordt aangeroepen.
@vorlox: Singletons ben ik niet zo'n fan van :)

Als ik dit zo lees kan ik beter eieren voor mijn geld kiezen en de functie custom_include gewoon in elke class includen... jammer, das toch niet zo mooi en behoorlijk omslachtig.

Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 20:52
xilent_xage schreef op zondag 20 juli 2008 @ 11:28:
Singletons ben ik niet zo'n fan van :)
Een Settings class is toch vaak een mooi voorbeeld van een Singleton. Door een Singleton te implementeren is je probleem meteen opgelost.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Waarom maak je er geen static functie van dan?

PHP:
1
2
3
4
5
6
7
8
9
// deze in MyClass gooien
static function includeFile($filename)
{
// doe je ding
// return je ding
}

// zo aanroepen
MyClass::includeFile('filename');


volgens mij is dat wat je wil. Er is overigens helemaal niks mis met singletons maar als het hierbij blijft is dat ook niet nodig..

Acties:
  • 0 Henk 'm!

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Waarom zet je je settings in een .php bestand? je kan deze veel beter in een xml of gewoon een txt bestand zetten. Dan maak je in php een klasse die deze settings uitleest.

Zal misschien iets minder snel zijn dan een include maar wel veel netter en minder kans op fouten.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Maar dan wel buiten je webroot plaatsen natuurlijk...

Je config in een singleton gooien is echt handig ieder geval, kun je er overal bij met iets als
PHP:
1
2
$config = Config::getInstance();
echo $config->path_root;

:)

Acties:
  • 0 Henk 'm!

Verwijderd

mjax schreef op zondag 20 juli 2008 @ 11:34:
Een Settings class is toch vaak een mooi voorbeeld van een Singleton. Door een Singleton te implementeren is je probleem meteen opgelost.
Een Singleton is een goed voorbeeld van niets meer dan een beperking die je sinds dag 1 je project in sluist. 'There can be only one' druist wel enorm in tegen de herbruikbaarheid van componenten. :)

Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Verwijderd schreef op zondag 20 juli 2008 @ 13:22:
[...]
Een Singleton is een goed voorbeeld van niets meer dan een beperking die je sinds dag 1 je project in sluist. 'There can be only one' druist wel enorm in tegen de herbruikbaarheid van componenten. :)
Dat is best een loos argument voor bijv. zoiets als een settings class of een database class waar je er bijv. altijd maar 1 van hebt. Als je voor een ander project dat ding niet als singleton nodig hebt, sloop je de singleton functionaliteit eruit en kan je hem gewoon gebruiken.

Ik kan echt met m'n pet niet bij die evangelisten die weigeren om een juiste oplossing voor een probleem te gebruiken omdat ze ergens gelezen hebben 'dat het vies is'. Uiteindelijk kom je dan op een andere oplossing uit, die ranzig is, andere mensen niet simpel kunnen doorgronden en jebent een hoop tijd kwijt voor niets.

[ Voor 9% gewijzigd door SchizoDuckie op 20-07-2008 13:46 ]

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
misschien had ik er ook even bij moeten vermelden dat ik mijn functie niet alleen gebruik voor het importeren van settings, maar ook van bijv functies, die binnen de class aangeroepen moeten kunnen worden...

@Face_-_LeSS: Daar ben ik juist vanaf gestapt. Ik vond t traag en omslachtig. Maargoed, das een andere discussie.

Acties:
  • 0 Henk 'm!

  • Toolskyn
  • Registratie: Mei 2004
  • Laatst online: 22-06 11:01

Toolskyn

€ 500,-

Waarschijnlijk zal er wel iets tegen zijn, maar voor zover ik zie heb je als er iets 'custom' is, je gewoon een bestandje met dezelfde naam hebt in je _custom mapje, waarom zet je dan niet gewoon _custom vooraan in je include path? Ik bedoel dan kijkt PHP wel voor je of die toevallig in _custom bestaat, zoniet dan gaat hij verder met de rest van je include path. (mijn vraag is dus eignelijk: wat is het nut van die functie?)

[ Voor 7% gewijzigd door Toolskyn op 20-07-2008 15:33 ]

gewooniets.nl


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Bedankt Toolskyn! Simple, beautiful! Niks Wel wat Niks op af te dingen. Stom dat ik er niet aan heb gedacht en het zo ingewikkeld aan het proberen was...

[ Voor 10% gewijzigd door xilent_xage op 20-07-2008 16:23 ]


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Alleen jammer dat deze methode niet werkt als de file gewoon gevonden kan worden: Dan checkt ie de custom dir natuurlijk niet...

Terug naar de tekentafel.

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Nevermind, . stond nog voor mijn dirs. Het werkt nu!

Acties:
  • 0 Henk 'm!

Verwijderd

SchizoDuckie schreef op zondag 20 juli 2008 @ 13:44:
Dat is best een loos argument voor bijv. zoiets als een settings class of een database class waar je er bijv. altijd maar 1 van hebt.
Tsja, je zou ook open kunnen staan om iets te leren. :)

Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

Verwijderd schreef op zondag 20 juli 2008 @ 13:22:
Een Singleton is een goed voorbeeld van niets meer dan een beperking die je sinds dag 1 je project in sluist. 'There can be only one' druist wel enorm in tegen de herbruikbaarheid van componenten. :)
:? Hoezo net herbuikbaar ? omdat je maar 1 instantiatie van dat object kan doen ? Wat heeft dat met herbuikbaarheid te maken ?

Acties:
  • 0 Henk 'm!

Verwijderd

igmar schreef op maandag 21 juli 2008 @ 11:35:
:? Hoezo net herbuikbaar ? omdat je maar 1 instantiatie van dat object kan doen ? Wat heeft dat met herbuikbaarheid te maken ?
Hoezo is het wel herbruikbaar volgens jou dan? Tip: denk dan vooral aan classes die de singleton gebruiken.

En om het maar even af te maken:
- Hoe testbaar is je code?
- Waar ligt de verantwoordelijkheid van je classes?
- Welke eigenschappen van de singleton class heeft de gebruikende class echt nodig?

Acties:
  • 0 Henk 'm!

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 11-09 09:49
Mijn ei:

Doe je settings toch maar in een php-bestand.
Ik wou eens de settings opslaan in settings.ini, en was dan bezig om een class te schrijven, daarnaast dan ook nog apche-bestand maken, om toegang tot het bestand te verbieden ed.

Veel werk, en heb vrij snel beseft dat het nogal een dol idee is om het zo ingewikkeld te maken.

Ik sla de settings van MySQL op in config.php, heel simpel:
PHP:
1
2
3
4
5
6
7
<?php
$server = 'localhost';
$username = 'root';
$password = 'root';
$database = 'database';
$config = 'config';
?>

Configureren van mysql doe ik vanuit de site zelf, dus ik hoef mijn bestand niet te bewerken de hard way.
doch, ik was te lui om het netjes te scripten met php: Ik include het bestand, probeer een verbinding te maken, als deze mislukt krijg je een form, waar je de gegevens in dient in te vullen. En op luie manier herscrhijf ik dan opnieuw het hele bestand. Voorkomt ook dat er mee gerotzooid wordt.

de laatste entry in het bestand is de naam van de table met al de andere config-dingen

Eenmaal ik een verbinding heb met de database, kan ik al men overige instellingen opslaan in de datebase.

er zijn andere manieren, dan werken met een bestand om instellingen in op te slaan, maar zo is het wel het gemakkelijkste. Normaal zal ook nooit iemand de inhoudt van je config bestand kunnen uitlezen. (tenzij je ftp wordt gehacked)

Uitreksel van de code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# MySQL connect
$server = NULL;         //server
$username = NULL;       //username
$password = NULL;       //password
$database = NULL;       //database
$config = NULL;         //table: general config

$mysql_settings = 'resources/shared/config.php';
if(!file_exists($mysql_settings))
{
    $fp_config = fopen($mysql_settings,'w');
    fclose($fp_config);
}
include($mysql_settings);

# ============================================================================
# connect MySQL
$db = new DBI($server, $username, $password,$database);
$status = $db->status();

# ============================================================================
# setup MySQL
if($status!=7)
{
    include('resources/apps/dbsetup/app.php'); 
}


Wel te verstaan dat ik hier niet al te veel energie in heb gestoken.
*als ik eens met verschillende rechten wil verbinden met de database, werk ik gewoon met 2 bestanden.

[ Voor 25% gewijzigd door g4wx3 op 21-07-2008 16:38 ]

http://www.softfocus.be/


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
g4wx3 schreef op maandag 21 juli 2008 @ 16:21:
Doe je settings toch maar in een php-bestand.
Ik wou eens de settings opslaan in settings.ini, en was dan bezig om een class te schrijven, daarnaast dan ook nog apche-bestand maken, om toegang tot het bestand te verbieden ed.

Veel werk, en heb vrij snel beseft dat het nogal een dol idee is om het zo ingewikkeld te maken.
Gewoon buiten de documentroot plaatsen, nergens gezeik meer mee. Settings in een .ini werkt heel handig. Ik gebruik Zend Framework en daar heb je gewoon een Config class waar je de locatie opgeeft en dan krijg je keurig je hele ini file terug als object. Echt een aanrader (sowieso is heel Zend Framework een enorme aanrader).

Acties:
  • 0 Henk 'm!

Verwijderd

g4wx3 schreef op maandag 21 juli 2008 @ 16:21:
Doe je settings toch maar in een php-bestand.
Ik wou eens de settings opslaan in settings.ini, en was dan bezig om een class te schrijven, daarnaast dan ook nog apche-bestand maken, om toegang tot het bestand te verbieden ed.

Veel werk, en heb vrij snel beseft dat het nogal een dol idee is om het zo ingewikkeld te maken.
Da's heel erg afhankelijk van wie de config moet beheren. Doe je (of 1 van je collega-PHP'ers) dat zelf, dan is een config.php een goed werkbare optie, maar wanneer 't moet gebeuren door een consultant of een helpdesk medewerker dan zou ik direct kiezen voor een settings.ini oplossing.
En het parsen van een ini-file is nou ook niet echt rocket science...

Het voordeel van een ini-file is dat je helpdesk medewerkers daar al ervaring mee hebben, en dat 't niet uitmaakt of die medewerker die '$' vergeet of niet helemaal correct met de quotes omgaat.
En zo'n parsertje schrijf je in een verloren uurtje of zo.

Het mooiste is natuurlijk een mooi config/admin tooltje waar ook de helpdesk blij van wordt, maar dat is vaak een iets te dure optie (kost je toch wel een paar dagen om daar een net framework voor op te zetten)...

Acties:
  • 0 Henk 'm!

Verwijderd

Wat een gelul hier. Een .ini bestand openen en inlezen kost je exact 1 function call naar parse_ini_file. Met het Zend Framework heb je meteen een zooitje mooie wrappers voor allerlei zaken als configuratie en database connectiviteit.

Ik stel voor dat vóórdat we met zijn allen g4wx3's kamikazetechnieken gaan toepassen, éérst nog even gaan kijken naar het Zend Framework. Dat zit dan toch nét even iets beter in elkaar.

Acties:
  • 0 Henk 'm!

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Verwijderd schreef op maandag 21 juli 2008 @ 21:41:
Wat een gelul hier. Een .ini bestand openen en inlezen kost je exact 1 function call naar parse_ini_file. Met het Zend Framework heb je meteen een zooitje mooie wrappers voor allerlei zaken als configuratie en database connectiviteit.

Ik stel voor dat vóórdat we met zijn allen g4wx3's kamikazetechnieken gaan toepassen, éérst nog even gaan kijken naar het Zend Framework. Dat zit dan toch nét even iets beter in elkaar.
Ja je hebt helemaal gelijk ik ga een heel framework gebruiken en 10 includes laden om mijn settings in een ini op te slaan... ik ben echt heel dom denk ik maar is een ini bestand niet gewoon een text bestand en is een php bestand dat ook niet gewoon ? Waarom logic loslaten op iets wat geen logic nodig heeft? inderdaad allemaal gelul hier
Pagina: 1