Private is niet heel private...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
class Storage
{
private $things = [];
public function add($item) {
$this->things[] = $item;
}
public function evaluate(Storage $container) {
return $container->things;
}
}
$bucket = new Storage();
$bucket->add("phone");
$bucket->add("biscuits");
$bucket->add("handcream");
$basket = new Storage();
print_r($basket->evaluate($bucket));
?>
class Storage
{
private $things = [];
public function add($item) {
$this->things[] = $item;
}
public function evaluate(Storage $container) {
return $container->things;
}
}
$bucket = new Storage();
$bucket->add("phone");
$bucket->add("biscuits");
$bucket->add("handcream");
$basket = new Storage();
print_r($basket->evaluate($bucket));
?>
Quote:
Wisten jullie al dat een private methode WEL toegankelijk is wanneer je deze aanroept vanaf een zelfde soort object?
Bekijk je eigen code eens. Als je methods zijn gewoon public.
Wat reshad bedoelt is dat de $basket instance toegang heeft tot de private things property van de $bucketninstance doordat je die instance meegeeft.
Reshad, het lijkt me weer zo'n typisch 'tja, dat noemen we nou php' probleem... iets dat niet hoort te kunnen dus.
Wouter J op 03/11/2013 23:52:39:
Ozzie, bekijk zijn code eens goed. Hij praat helemaal niet over methods...
Reshad F op 03/11/2013 22:25:41:
Wisten jullie al dat een private methode WEL toegankelijk is...
Ozzie, ik hoop dat je de rest van mijn reactie ook hebt gelezen?
Ozzie, jouw eerste voorbeeld resulteert in een error.rivate properties kun je allen van binnen de huidige instance aanroepen.
Toevoeging op 04/11/2013 00:12:22:
Dan is het inderdaad wel vaag...
Quote:
Objects of the same type will have access to each others private and protected members even though they are not the same instances. This is because the implementation specific details are already known when inside those objects.
Bron: http://us1.php.net/manual/en/language.oop5.visibility.php#language.oop5.visibility-other-objects
Ook andere oo talen hebben dit: http://stackoverflow.com/q/14008200/1149495
Ah ja sorry ozzie ik bedoelde niet de methode :p maar wel raar dat dit kan inderdaad. ik vraag me ook af wat voor situatie je dit nou nodig zou hebben.
Goed gevonden Wouter. Toch blijft het wel vreemd.
Code (php)
>> Ah ja sorry ozzie ik bedoelde niet de methode :p
No problemo :)
Interessant Reshad. Weer wat geleerd.
Ozzie PHP op 04/11/2013 12:31:21:
>> Even mijn php vrienden om hulp gevraagd. Het blijkt bydesign te zijn:
Goed gevonden Wouter. Toch blijft het wel vreemd.
Goed gevonden Wouter. Toch blijft het wel vreemd.
Code (php)
Weet je wat vreemd is?
Een constructor maken voor een object die als argument een instance van zichzelf heeft.
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
34
35
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
34
35
<?php
class Storage
{
private $things;
public function add($thing)
{
$this->things = $things;
}
}
$bucket = new Storage();
$bucket->add("phone");
$bucket->add("biscuits");
$bucket->add("handcream");
$getThings = function () {
return $this->things;
};
$getThings->bindTo($bucket);
echo 'Bucket<br>======';
echo implode('<br>', $getThings());
$basket = new Storage();
$basket->add('logo sketch');
$basket->add('stupid idea');
$getThings->bindTo($basket);
echo 'Basket<br>======';
echo implode('<br>', $getThings());
?>
class Storage
{
private $things;
public function add($thing)
{
$this->things = $things;
}
}
$bucket = new Storage();
$bucket->add("phone");
$bucket->add("biscuits");
$bucket->add("handcream");
$getThings = function () {
return $this->things;
};
$getThings->bindTo($bucket);
echo 'Bucket<br>======';
echo implode('<br>', $getThings());
$basket = new Storage();
$basket->add('logo sketch');
$basket->add('stupid idea');
$getThings->bindTo($basket);
echo 'Basket<br>======';
echo implode('<br>', $getThings());
?>
Resultaat:
Bucket
======
phone
biscuits
handcream
Basket
======
logo sketch
stupid idea
Gewijzigd op 04/11/2013 17:55:59 door Wouter J
Dit kan trouwens gewoon in bijna elke programmeertaal, en als je als programmeur dit soort dingen gaat doen, mag jezelf afvragen of je niet beter een ander vak kunt gaan leren (niet persoonlijk).
Het maakt bijv. het proxy pattern stukken makkelijker, aangezien je makkelijk toegang hebt tot private variabelen. En op php.net staat ook wel een leuk voorbeeldje, closure.bindTo