[PHP] refereren naar object dat instance uitvoert

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • CB32
  • Registratie: November 2011
  • Laatst online: 18:17
Mijn vraag
Ik heb een class 'Info' die op zijn beurt weer andere classes instanced. Ik geef op dit moment $infoId mee aan de subclass zodat hij ook de juiste data laadt:

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
<?php 

class Info{

  public $data;
  public $extra;

  public function __construct(int $infoId){
    $this->data = $this->get($infoId);
    $this->extra = new \MyModels\Info_extra($infoId);
  }

  private function get(){ /** get from 'info' **/ }
}


class Info_extra{

  public $extraData;

  public function __construct(int $infoId){
    $this->extraData = $this->get($infoId);
  }

  private function get(){ /** get from 'info__extra' **/ }
}
 ?>


Is het mogelijk dat ik vanuit de Info_extra toegang kan krijgen tot het de (publieke) eigenschappen van Info, het object dat Child_extra geïnitialiseerd heeft? Zodat zoiets mogelijk wordt?

PHP:
1
2
3
4
5
6
7
8
9
10
11
class Info_extra{
 
   public $extraData;
 
   public function __construct(){
     $infoId = TheObjectThatInstancedThisObject->id;
     $this->extraData = $this->get($infoId);
   }
 
   private function get(){ /** get from 'info__extra' **/ }
 }



Relevante software en hardware die ik gebruik
PHP 7.3

Wat ik al gevonden of geprobeerd heb
Uiteraard ben ik bekend met het Parent/Child principe maar dit is iets wat ik expliciet NIET zoek. Ik houd alle basisinformatie in de class 'Info' en naargelang wat nodig is, heb ik ook één of meerdere 'extra' classes nodig. Ik vind eigenlijk alleen maar resultaten voor parent/child. Zoeken op 'reference instancing object' geeft is de enige zoekterm die ik nog kon bedenken maar daar vind ik ook niet dat dit mogelijk is.

[ Voor 3% gewijzigd door CB32 op 27-07-2020 10:54 ]

Beste antwoord (via CB32 op 30-07-2020 10:15)


  • webfreakz.nl
  • Registratie: November 2003
  • Laatst online: 21-08 15:56

webfreakz.nl

el-nul-zet-é-er

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Info_extra{

  public $extraData;
  public $infoObj;

  public function __construct(Info $infoObj, int $infoId){
    $this->infoObj = $infoObj;
    $this->extraData = $this->get($infoId);
  }
  
  private function getDataFromInfo()
  {
      return $this->infoObj->data->...
  }

  private function get(){ /** get from 'info__extra' **/ }
}

Zoiets?

"You smell that, son? What sir? Napalm, I love the smell of napalm in the mornin!" || Children of Bodom fan!

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • webfreakz.nl
  • Registratie: November 2003
  • Laatst online: 21-08 15:56

webfreakz.nl

el-nul-zet-é-er

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Info_extra{

  public $extraData;
  public $infoObj;

  public function __construct(Info $infoObj, int $infoId){
    $this->infoObj = $infoObj;
    $this->extraData = $this->get($infoId);
  }
  
  private function getDataFromInfo()
  {
      return $this->infoObj->data->...
  }

  private function get(){ /** get from 'info__extra' **/ }
}

Zoiets?

"You smell that, son? What sir? Napalm, I love the smell of napalm in the mornin!" || Children of Bodom fan!


Acties:
  • 0 Henk 'm!

  • CB32
  • Registratie: November 2011
  • Laatst online: 18:17
Deze oplossing heeft alleen als nadeel dat het hele object gekopieerd wordt. Kan nog een &reference gebruiken uiteraard.

Wat ik graag zou willen voorkomen is de noodzaak om argumenten met de subclass constructor mee te moeten geven.

Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

Het object wordt niet gekopieerd, alleen de identifier.

Misschien kan je uitleggen waarom je wil voorkomen dat je het mee moet geven aan de constructor dan kunnen anderen er een oplossing voor bedenken of je uitleggen dat het misschien helemaal niet zo erg is?

Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
CB32 schreef op maandag 27 juli 2020 @ 16:00:
Deze oplossing heeft alleen als nadeel dat het hele object gekopieerd wordt. Kan nog een &reference gebruiken uiteraard.
Nope... objecten zijn in PHP altijd bij reference! De &reference is alleen nodig bij alles wat geen object is.

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

  • CB32
  • Registratie: November 2011
  • Laatst online: 18:17
Bedankt vooor het meedenken tot nu toe.
emnich schreef op maandag 27 juli 2020 @ 16:06:
Het object wordt niet gekopieerd, alleen de identifier.

Misschien kan je uitleggen waarom je wil voorkomen dat je het mee moet geven aan de constructor dan kunnen anderen er een oplossing voor bedenken of je uitleggen dat het misschien helemaal niet zo erg is?
Ik wist niet dat het altijd bij reference is, dus dat is mooi.

Iets meer context (versimpeld):
Ik heb een systeem met informatie van kinderen onder onze zorg. Elk kind heeft een relatie, en verschillende gebruikers mogen de informatie wel/niet zien afhankelijk van de relatie van het kind. Als ik een subclass laad, moet deze dus ook controleren of de gebruiker toestemming heeft. Op dit moment regel ik dat zo (code is niet 1:1 kopie, wees gerust...):

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
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php 

class Child{
  public $childId, $relationId;
  public array $data;
  public $note;

  public function __construct(int $childId){
    // Get Child
    $this->get($childId);

    // Load subclasses
    $this->note = new \Child\Note($this->childId, $this->relationId);
  }

  // Get data from database
  private function get(int $childId){
    $this->childId = $childId;
    $this->relationid = getRelationFromDB($this->childId);

    // Require Permission
    requirePermission('child_basic', $this->relationId); // throws exception if no permission
    $this->data = getRestOfData($this->childId);

  }
}

class Note{
  public $childId, $relationId;
  public array $data;

  public function __construct(int $childId, string $relationId){
    $this->childId = $childId;
    $this->relationId = $relationId;

    // Require Permission
    requirePermission('child_note', $this->relationId);

    // Get data
    $this->data = $this->get()
  }

  // Get note data from database
  private function get(){
    $this->data = getNoteData($this->childId);
  }
}
?>


Met name de properties $childId en $relationId in class Note voelen nog al dubbelop. Ik zat er inderdaad aan te denken om gewoon het hele $child object mee te geven, zeker nu dat blijkbaar automatisch bij reference is, maar ik dacht als er een nettere oplossing is dan is dat mooi. Als dat niet het geval is, prima.

Acties:
  • +1 Henk 'm!

  • CB32
  • Registratie: November 2011
  • Laatst online: 18:17
webfreakz.nl schreef op maandag 27 juli 2020 @ 13:33:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Info_extra{

  public $extraData;
  public $infoObj;

  public function __construct(Info $infoObj, int $infoId){
    $this->infoObj = $infoObj;
    $this->extraData = $this->get($infoId);
  }
  
  private function getDataFromInfo()
  {
      return $this->infoObj->data->...
  }

  private function get(){ /** get from 'info__extra' **/ }
}

Zoiets?
Het lijkt er op dat het wat ik in mijn originele vraag wilde bereiken niet mogelijk is, en het injecteren van het hoofdobject in mijn geval de beste / juiste oplossing is. Ik zal dan alleen het object hoeven meegeven en niet ook nog eens het ID aangezien ik die kan aflezen uit $this->infoObj;

Bedankt voor het meedenken.

[ Voor 4% gewijzigd door CB32 op 30-07-2020 10:18 ]

Pagina: 1