beste leden,

Stel ik heb in m`n method header een variable zoals dit:


public function Bind(Object $object, String $name){
    if(is_object($object){
     // doe iets
    }
}


Dan moet ik toch gewoon elk willekeurig object kunnen meegeven in deze methode?

Stel ik heb een database object ( class Database) dan is het in elke willekeurige andere taal gewoon een object, immers alle objecten ( of het nou ene database object is of wat anders ) kan ik ze altijd en ten alle tijden gebruiken als object. In PHP echter kan dit niet, of doe ik iets fout? Kan iemand uitleg geven hoe het zit?

Groeten
Ik heb het niet gekopieerd en geprobeerd te draaien, maar wat zou hier niet aan werken dan? Volgens mij doet dit precies wat je wilt? Ik weet niet wat de functie moet doen maar als je wilt weten of het object van een bepaalde klasse is kan je ook 'instanceof' gebruiken.

Edit: Even geprobeerd, je geeft inderdaad aan dat $object van het type Object moet zijn. Daarmee verwijder je juist de 'vrijheid' die je wilt, omdat Object != Database. Door alleen een variabele op te geven $object, kan je dmv is_object controleren of het daadwerkelijk een object is. Daarnaast kan je met 'instanceof' ook specifiek kijken of het bijvoorbeeld die Database was.

Jouw voorbeeld wordt dan zo:
<?php
public function Bind($object, $name){
    if(is_object($object){
     // doe iets
    }
}
?>


Wil je weten of het van het type Database is dan krijg je iets als:
<?php
public function Bind($object, $name){
    if($object instanceof Database){ // Database kan ook de string representatie van de klasse zijn.
     // doe iets
    }
}
?>


En om dmv type hint meteen het type van het object af te vangen in geval van Database krijg je:
<?php
public function Bind(Database $object, $name){
     // doe iets
}
?>


Als je dan een ander object meegeeft gooit de functie zelf meteen al een exception.
Hey JB, ik snap wat je bedoelt, maar de Bind() methode moet juist wat vrijer zijn. De Bind() methode moet een object binnen krijgen zonder dat er direct gekeken wordt naar wat voor soort object het is. Het casten kan eventueel later wel gebeuren, maar ik wil een globale methode om objecten aan m`n list toe te voegen. En overerving betekent dat een db object in z`n core nog steeds een object is, dus de Field var Object moet hier normaliter passen.

Andersom zou het niet kunnen m.a.w.


public function Bind(Database $db, $name){
}


Hier moet dus minstens een database object in gaan of een object dat in ieder geval van een database object overerft. Terwijl andersom ( ofwel: Object) hier dus alle objecten hoort toe te laten.

Mocht ik inderdaad gaan typecasten zou ik natuurlijk instanceof kunnen gebruiken, maar voor nu is dat niet relevant omdat ik simpelweg objecten toe wil voegen aan een list object en om nou voor elk type een methode te schrijven is ook niet nodig. Ik denk dat ik de object declaratie weg haal, en alleen check dmv de is_object() methode, scheelt een berg.



Nee dat snap ik, wist inderdaad niet wat de exacte bedoeling was vandaar. Dan zou ik inderdaad de Object vereiste weghalen en alleen is_object gebruiken. Eigenlijk bereik je daar uiteindelijke exact hetzelfde mee. Eventueel zou je natuurlijk een base class kunnen maken die Object heet en alle klassen uit je app daarop extenden maar is_object lijkt me net zo praktisch dan.
ja mooi zo laten joh. Ik ben er al achter dat de base class STDClass is, niet Object. Normaliter verwacht je hier dus Object zoals in Java, C# of Python, maar aangezien PHP geschreven is bovenop C en de OO van C++ vandaan komt, de baseclass dus stdclass is. Op zich wel logisch maar in dit opzicht vrij nutteloos. Bovendien had ik de intentie om het echt netjes OO te schrijven maar er zijn al zoveel obstakels dat het nooit mogelijk wordt om iets netjes in OO te schrijven. M.a.w. typecasting weg laten en var declaratie mooi binnen de body doen niet in de header.

edit: ben erachter dat er geen gobale baseobject is in PHP. stdclass is een leeg omhulsel dat verder geen nut dient, wat op zich logisch is voor PHP omdat je heel makkelijk een object kan aanmaken op deze manier.


$var = array("iets"=>"blah");
$var2->iets = "blah";


beide mogen volgens de spec wat eigenlijk betekent dat $var bij de 2e al een object maakt. ofwel een stdclass.
Types meegeven in PHP OO kan helaas niet:
<?php

class User
{
protected $id;
public function __construct( int $id )
{
$this->id = $id;
}
}

$someUser = new User(13); // geeft foutmelding
?>

Wel kun je instanceof vervangen door de class er in te zetten:
<?php

class DB
{
//...
public function getUser( $id )
{
// ...
return $result['user'];
}
}

class User
{
public function __construct( $id, DB $db )
{
$this->_db = $db;
$this->id = $id;
}
public function getUser()
{
return $this->_db->getUser($this->id);
}
}

$db = new DB();
$someUser = new User( 12, $db );
?>

Reageren