Private is niet heel private...

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Reshad F

Reshad F

03/11/2013 22:25:41
Quote Anchor link
Wisten jullie al dat een private methode WEL toegankelijk is wanneer je deze aanroept vanaf een zelfde soort object? is dit in alle talen zo, of alleen in php?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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));
?>
 
PHP hulp

PHP hulp

27/11/2024 21:35:38
 
Ozzie PHP

Ozzie PHP

03/11/2013 23:20:47
Quote Anchor link
Reshad, ik weet niet wat je bedoelt.

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.
 
Wouter J

Wouter J

03/11/2013 23:52:39
Quote Anchor link
Ozzie, bekijk zijn code eens goed. Hij praat helemaal niet over methods...

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.
 
Ozzie PHP

Ozzie PHP

03/11/2013 23:56:23
Quote Anchor link
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...
 
Wouter J

Wouter J

03/11/2013 23:57:27
Quote Anchor link
Ozzie, ik hoop dat je de rest van mijn reactie ook hebt gelezen?
 
Ozzie PHP

Ozzie PHP

04/11/2013 00:05:49
Quote Anchor link
Wouter, wat jij zegt was ook mijn eerste gedachte. Dat het om de property gaat. Even goed lezen en je ziet dat Reshad het over een method heeft. Dan moet jij niet tegen mij gaan zeggen "Hij praat helemaal niet over methods...", want dat doet hij dus wel. Het kan zijn dat hij zich vergist en hij dacht dat hij evaluate() private had gemaakt. Vandaar ook mijn reactie. De kans is groot, maar dat weten wij beiden niet en kunnen we dus alleen maar naar raden, dat hij het inderdaad over de property heeft. In dat geval... waarom is het dan raar? Je geeft een object X aan het andere object Y. Object Y beschikt dan over het object X en roept binnen object X de private property aan. De property is dus toegankelijk vanuit het object zelf. Dat is hetzelfde wanneer je zegt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

var_dump($bucket->things);

?>

Alleen gooi je het nu in een method/functie:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php

function foo($bucket) {
  var_dump($bucket->things);
}


?>
Gewijzigd op 04/11/2013 00:07:29 door Ozzie PHP
 
Wouter J

Wouter J

04/11/2013 00:10:03
Quote Anchor link
Ozzie, jouw eerste voorbeeld resulteert in een error.rivate properties kun je allen van binnen de huidige instance aanroepen.
 
Ozzie PHP

Ozzie PHP

04/11/2013 00:11:36
Quote Anchor link
Krek, je hebt gelijk... ik lig te slapen...

Toevoeging op 04/11/2013 00:12:22:

Dan is het inderdaad wel vaag...
 
Wouter J

Wouter J

04/11/2013 08:07:53
Quote Anchor link
Even mijn php vrienden om hulp gevraagd. Het blijkt bydesign te zijn:

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
 
Reshad F

Reshad F

04/11/2013 11:12:38
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

04/11/2013 12:31:21
Quote Anchor link
>> Even mijn php vrienden om hulp gevraagd. Het blijkt bydesign te zijn:

Goed gevonden Wouter. Toch blijft het wel vreemd.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$veryprivate
= new Storage();
$public      = new Storage($veryprivate );
var_dump($public->evaluate()); // haha, I can show very private things!
$otherpublic = new OtherStorage($veryprivate);
var_dump($otherpublic->evaluate()); // are you stupid! You can't show things that are private!
?>

>> Ah ja sorry ozzie ik bedoelde niet de methode :p

No problemo :)
 
Reshad F

Reshad F

04/11/2013 13:44:18
Quote Anchor link
Haha nou ozzie ik kwam ook achter heel veel andere dingen. lees dit artikeltje maar is door..

http://www.sitepoint.com/lesser-known-features-of-phps-oo-model/
 
Frank Nietbelangrijk

Frank Nietbelangrijk

04/11/2013 13:57:56
Quote Anchor link
Interessant Reshad. Weer wat geleerd.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/11/2013 17:14:51
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$veryprivate
= new Storage();
$public      = new Storage($veryprivate );
var_dump($public->evaluate()); // haha, I can show very private things!
$otherpublic = new OtherStorage($veryprivate);
var_dump($otherpublic->evaluate()); // are you stupid! You can't show things that are private!
?>

Weet je wat vreemd is?
Een constructor maken voor een object die als argument een instance van zichzelf heeft.
 
- Raoul -

- Raoul -

04/11/2013 17:45:19
Quote Anchor link
Je kan ook non-static methods in PHP aanroepen als static :-)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php

class Test { public function test() {echo 'Hoi'; } }

Test::test(); // 'Hoi'

?>
 
Wouter J

Wouter J

04/11/2013 17:53:04
Quote Anchor link
Goed, gaan we nog wat leuker werken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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());
?>

Resultaat:

Bucket
======
phone
biscuits
handcream

Basket
======
logo sketch
stupid idea
Gewijzigd op 04/11/2013 17:55:59 door Wouter J
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/11/2013 18:26:48
Quote Anchor link
Dit is wel erg extreem Wouter!

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).
 
Wouter J

Wouter J

04/11/2013 18:51:10
Quote Anchor link
Ger, meen je dat serieus? Ik vind het een geweldige API in 5.4. Het binden van een Closure aan een object. Een soort uitbreiden van een object. Ik hou er wel van.

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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.