private static
Nogmaals, robots (wat voor soort dan ook) hebben hier niks mee te maken, en een andere server kan pas toegang tot jouw server krijgen als jij die toegang geeft. Maar goed, succes verder ...
Als je server als zó ver open staat dat een externe server een class kan includen, kan deze alle karakters gewoon uitlezen, ook die van private of protected properties en methoden.
Gebruik maar eens private of protected properties en doe dan van buiten een var_dump() van een object: je krijgt alle properties te zien. Ja, ook dat databasewachtwoord.
Als ik hier dit doe:
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
27
28
29
30
31
32
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
27
28
29
30
31
32
<?php
include_once "DBverbinding.class.php";
class Unthinking{
private $host;
private $database;
private $username;
private $password;
public function __construct(){
//$this->host = DBverbinding::getHost();
//$this->database = DBverbinding::getDb();
//$this->username = DBverbinding::getUser();
//$this->password = DBverbinding::getDb();
try{
$this->db = new PDO("mysql:host=". $this->host .";dbname=". $this->database ."",$this->username /*,$this->password */);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
$this->set_error("Fout op regel: ".$e->getLine());
$this->set_error("Foutmelding: ".$e->getFile());
$this->set_error("Fout in bestand: ".$e->getMessage());
}
}
}
$majority = new Unthinking;
var_dump($majority);
?>
include_once "DBverbinding.class.php";
class Unthinking{
private $host;
private $database;
private $username;
private $password;
public function __construct(){
//$this->host = DBverbinding::getHost();
//$this->database = DBverbinding::getDb();
//$this->username = DBverbinding::getUser();
//$this->password = DBverbinding::getDb();
try{
$this->db = new PDO("mysql:host=". $this->host .";dbname=". $this->database ."",$this->username /*,$this->password */);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
$this->set_error("Fout op regel: ".$e->getLine());
$this->set_error("Foutmelding: ".$e->getFile());
$this->set_error("Fout in bestand: ".$e->getMessage());
}
}
}
$majority = new Unthinking;
var_dump($majority);
?>
geeft ie dit als antwoord:
Code (php)
1
object(Unthinking)#1 (5) { ["host":"Unthinking":private]=> NULL ["database":"Unthinking":private]=> NULL ["username":"Unthinking":private]=> NULL ["password":"Unthinking":private]=> NULL ["db"]=> object(PDO)#2 (0) { } }
Maar als ik dit doe:
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
27
28
29
30
31
32
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
27
28
29
30
31
32
<?php
include_once "DBverbinding.class.php";
class Unthinking{
private $host;
private $database;
private $username;
private $password;
public function __construct(){
$this->host = DBverbinding::$host;
$this->database = DBverbinding::$db;
$this->username = DBverbinding::$user;
$this->password = DBverbinding::$password;
try{
$this->db = new PDO("mysql:host=". $this->host .";dbname=". $this->database ."",$this->username /*,$this->password */);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
$this->set_error("Fout op regel: ".$e->getLine());
$this->set_error("Foutmelding: ".$e->getFile());
$this->set_error("Fout in bestand: ".$e->getMessage());
}
}
}
$majority = new Unthinking;
var_dump($majority);
?>
include_once "DBverbinding.class.php";
class Unthinking{
private $host;
private $database;
private $username;
private $password;
public function __construct(){
$this->host = DBverbinding::$host;
$this->database = DBverbinding::$db;
$this->username = DBverbinding::$user;
$this->password = DBverbinding::$password;
try{
$this->db = new PDO("mysql:host=". $this->host .";dbname=". $this->database ."",$this->username /*,$this->password */);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
$this->set_error("Fout op regel: ".$e->getLine());
$this->set_error("Foutmelding: ".$e->getFile());
$this->set_error("Fout in bestand: ".$e->getMessage());
}
}
}
$majority = new Unthinking;
var_dump($majority);
?>
Geeft php:
Code (php)
1
Fatal error: Cannot access protected property DBverbinding::$host in i:\think\htdocs\unthinking.php on line 11
Dus is de property eigenlijk wel beschermd maar niet te gebruiken.
Wanneer ik bijvoorbeeld de method public heb en de get functies gebuik maakt het niets
uit hoe de properties staan zowel: public, protected als private.
Misschien dat mijn vraag een beetje onduidelijk was.
Toevoeging op 20/01/2015 17:54:05:
Maar ik denk nu te begrijpen dat self:: dus eigenlijk de public inerits en dat ik geen self had moeten gebruiken.
Nee ... hij is niet beschermd, je hebt simpelweg een programmeerfout gemaakt. Dat geeft ie ook keurig aan:
Fatal error: Cannot access protected ...
Nogmaals, ik bedoel het niet vervelend, maar je moet echt even wat informatie gaan opzoeken over hoe classes werken. Op deze manier schiet het niet echt op.
Dat probeer ik te zeggen.
Toevoeging op 20/01/2015 18:35:01:
Zelfde vraag maar dan anders gesteld:
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
27
28
29
30
31
32
33
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
27
28
29
30
31
32
33
<?php
class DBverbinding{
private static $host;
private static $db;
private static $user;
private static $password;
public static function getHost(){
self::$host = "127.0.0.1";
return self::$host;
}
public static function getDB(){
self::$db = "unthinking";
return self::$db;
}
public static function getUser(){
self::$user = "localhost";
return self::$user;
}
public static function getPW(){
self::$password = "";
return self::$password;
}
}
echo(DBverbinding::getHOST());
?>
class DBverbinding{
private static $host;
private static $db;
private static $user;
private static $password;
public static function getHost(){
self::$host = "127.0.0.1";
return self::$host;
}
public static function getDB(){
self::$db = "unthinking";
return self::$db;
}
public static function getUser(){
self::$user = "localhost";
return self::$user;
}
public static function getPW(){
self::$password = "";
return self::$password;
}
}
echo(DBverbinding::getHOST());
?>
Toevoeging op 20/01/2015 18:35:21:
Waarom werkt dit?
DBverbinding::getHOST() probeert de waarde DBverbinding::$host op te vragen.
DBverbinding::getHOST() en DBverbinding::$host behoren beiden tot de zelfde class.
DBverbinding::getHOST() mag bij DBverbinding::$host.
private geeft aan dat het alleen benaderd kan worden vanuit de zelfde class.
protected geeft aan dat het alleen benaderd kan worden vanuit de zelfde class of subclasses.
public geeft aan dat het vanaf elke plek benaderd kan worden.
Ik ga verder proberen.
In ieder geval bedankt voor de hulp zover.
Toevoeging op 20/01/2015 18:46:18:
Bedankt voor de hulp.
Ik had het bericht nog niet gelezen.
Mijn vraag was waarom het wel werkt.
Als het normale methods waren is het ook zo denk ik.
Toevoeging op 20/01/2015 19:02:15:
Mijn vraag was om een verduidelijking in de classes.
In ieder geval bedankt.
Wat ik bedoelde is dit:
Code (php)
Code (php)
Als de method anders staat dan de propertie.
Dus als de method public is worden de properties dat ook meteen.
Toevoeging op 20/01/2015 19:20:17:
Frank heeft het antwoord dus eigenlijk al gegeven maar ik denk dat ik het antwoord niet
begreep.
En omdat het niet de goede manier was ben ik verder met static gaan proberen.
Iedereen in ieder geval bedankt.
Gewijzigd op 20/01/2015 19:06:52 door unthinking majority
Onder 'werken' versta ik, de host wordt geprint zonder foutmeldingen. Ik heb uitgelegd waarom je geen foutmelding kreeg wanneer je de public method DBverbinding::getHOST() gebruikt en waarom je dus een foutmelding krijgt als je de private (statische) variabele DBverbinding::$host probeert te gebruiken.
"Dus als de method public is worden de properties dat ook meteen."
Nee hoor.
Je hebt een methode gemaakt om de variabele publiekelijk leesbaar te maken.
Schrijven is nog steeds niet mogelijk voor het publiek, alleen maar voor de class zelf.
Pas als je ook een public methode gemaakt hebt om de variabele aan te passen heb je de private/protected variabele in essentie public gemaakt.
Hopelijk is public/protected/private je ondertussen een beetje duidelijk.
Dat zou betekenen dat ik weer terug kan komen op mijn "ga inloggegevens aub NIET hardcoden" punt.
Dus... emhe... niet hardcoden maar een config bestand aanmaken en uitlezen aub?
Dat zou mooi EN ietsjes veiliger zijn. Niet veel, maar ietsjes. Zolang het config bestand tenminste niet via een url bereikbaar is (zet het buiten de webroot!)
Het klopt dat het een functie was om als object te gebruiken.
De propertie stond op private en de method op public.
De host werd geprint omdat ik de method aanriep en niet de propertie.
Als config file zal ik naar ini files gaan kijken.