Ajattelin tässä ruveta tekemään ensimmäistä olio-pohjaista testiprojektia PHP:lla. Alkumetreillä tuli ongelmia, johon ei mistään tunnu saavan apua. Suurin osa googlesta saaduista vastauksista vaan neuvoo laittamaan error reportingin pois päältä tai pienemmälle tasolle...
Virheilmoitus:
Notice: Undefined variable: settings in mysql.php on line 10 Notice: Trying to get property of non-object in mysql.php on line 10
mysql.php
<?php require_once("settings.php"); class MySQL { private $handle; function __construct($ip = "default", $user = "default", $pass = "default") { if($ip == "default" && $user == "default" && $pass == "default") { $ip = $settings->mysqlIp; $user = $settings->mysqlUser; $pass = $settings->mysqlPass; } echo "<h1>".$settings->mysqlIp."</h1>"; $this->handle = mysql_connect($ip, $user, $pass) or die($lang->mysqlConnectFail."<br/>\n".mysql_error()); } function __destruct() { mysql_close($this->handle); echo "debug"; } } $mysli = new MySQL; ?>
settings.php
<?php class Settings { public $defaultLang = "en"; public $mysqlIp = "localhost"; public $mysqlUser = "root"; public $mysqlPass = ""; function __construct() { if(!@include_once("../lang/".$this->defaultLang.".php")) { die("Language file could not be found!<br/>\nKielitiedostoa ei löydy!"); } } } $settings = new Settings; ?>
Yritän myös echottaa tuota muuttujaa tuossa h1-tageihin, mutta eipä tulosta mitään. Kumma kun kuitenkin tuo kielen asetus onnistuu settings.php-tiedostossa...
Kutsutaanko luokkien __destruct-funktiota aina kun skriptin suoritus lopetetaan, vai onko tämä joku php.inin asetuksista? On meinaan melko kätevä tuo destructin yhteydessä myslin yhteyden sulkeminen. Ei tarvitse erikseen sitä sitten sulkea.
Edittiä: Niin ja tuleehan tuo valitus tietysti jokaisesta tulostusyrityksestä, eikä pelkästään tuon ip:n kohdalla. Rivit 10,11,12,14 ja 15 siis kyseessä.
Edit2: Sain toimimaan kun laitoin __construct-funtion sisään rivin "global $settings". Aivot vähän jäässä.
Onko todella tarvetta luoda $settings olio staattisia mysql asetuksia varten, koska nuo muuttujat tuskin muuttuvat koskaan. Muutenkin tuota ajattelua voisi ehkä hiukan muuttaa toiseen suuntaan.
Olisiko tällaisesta muutoksesta apua?
<?php ***mysql.php class mysql{ private $yhteys; private $kanta; private $kayttaja; private $salasana; private $osoite; public function __costruct( $os, $tu, $pa, $ka ){ $this -> kayttaja = $tu; $this -> salasana = $pa; $this -> osoite = $os; $this -> kanta = $ka; } public function yhdista(){ $this -> yhteys = mysql_connect( $this -> osoite, $this -> tunnus, $this -> salasana ); mysql_select_db( $this -> kanta ); } }
Varsinaisen sivun puolella lisäät vaikkapa asetukset.php sivun, jossa on luotu tuo $settings olio. Esimerkiksi näin voisi hoitaa tuon puolen.
***index.php <?php require("liita/asetukset.php"); $asetus = new Asetus( "localhost", "root", "", "kanta" ); $mysql = new mysql( $asetus -> osoite, $asetus -> tunnus, $asetus -> salasana, $asetus -> kanta ); ?>
Itse ongelma on, että globaalit muuttujat eivät oletusarvoisesti näy funktioiden sisällä.
<?php $i = 1; function f() { $i = 2; // paikallinen $i, eri kuin globaali } function g() { global $i; // käytetään globaalia $i:tä $i = 2; } f(); echo $i, "\n"; // edelleen 1 g(); echo $i, "\n"; // nyt 2 ?>
Jos asetuksia on vain yhdet, voit tehdä näinkin:
<?php class Settings { public $asetus = 1; private static $settings; public function get() { if (!self::$settings) { self::$settings = new Settings(); } return self::$settings; } } echo Settings::get()->asetus, "\n"; ?>
Toisaalta tällöin on luultavasti järkevää käyttää täysin staattisia funktioita ja muuttujia, jolloin yhtään Settings-oliota ei tarvitse luoda.
<?php class Settings { public static $asetus = 1; } echo Settings::$asetus, "\n"; ?>
Tarkoitus on siis sellainen, että loppukäyttäjän tarvitsee muokata pelkästään tuonne settings.php-tiedostoon omat asetuksensa. Ehkä jossain vaiheessa voisi tehdä jonkun installerin, joka tekisin tämän käyttäjän puolesta. Koska koodi on näin alkuvaiheessa, ei tuonne asetuksiin ole vielä muita muuttujia päässyt.
Voin melkeinpä suositella ini-tiedostojen käyttöä. Luultavasti loppukäyttäjäkin ymmärtää paremmin niitä kuin PHP-muuttujia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.