programming php

26
CHAPTER 6 Objects 147

Upload: vijayakumarmani

Post on 01-Oct-2015

224 views

Category:

Documents


0 download

DESCRIPTION

The document is download via internet

TRANSCRIPT

  • CHAPTER 6

    Objects

    2EMHFWRULHQWHGSURJUDPPLQJ223RSHQVWKHGRRUWRFOHDQHUGHVLJQVHDVLHUPDLQWHQDQFHDQGJUHDWHUFRGHUHXVH7KHSURYHQYDOXHRI223LVVXFKWKDWIHZWRGD\ZRXOGGDUHWRLQWURGXFHDODQJXDJHWKDWZDVQWREMHFWRULHQWHG3+3VXSSRUWVPDQ\XVHIXOIHDWXUHVRI223DQGWKLVFKDSWHUVKRZV\RXKRZWRXVHWKHP223DFNQRZOHGJHVWKHIXQGDPHQWDOFRQQHFWLRQEHWZHHQGDWDDQGWKHFRGHWKDWZRUNVRQWKDWGDWDDQGLWOHWV\RXGHVLJQDQGLPSOHPHQWSURJUDPVDURXQGWKDWFRQQHFWLRQ)RUH[DPSOHDEXOOHWLQERDUGV\VWHPXVXDOO\NHHSVWUDFNRIPDQ\XVHUV,QDSURFHGXUDOSURJUDPPLQJODQJXDJHHDFKXVHUZRXOGEHDGDWDVWUXFWXUHDQGWKHUHZRXOGSUREDEO\EHDVHWRIIXQFWLRQVWKDWZRUNZLWKXVHUVGDWDVWUXFWXUHVFUHDWHWKHQHZXVHUVJHWWKHLULQIRUPDWLRQHWF,QDQREMHFWRULHQWHGSURJUDPPLQJODQJXDJHHDFKXVHUZRXOGEHDQREMHFWDGDWDVWUXFWXUHZLWKDWWDFKHGFRGH7KHGDWDDQGWKHFRGHDUHVWLOOWKHUHEXWWKH\UHWUHDWHGDVDQLQVHSDUDEOHXQLW,QWKLVK\SRWKHWLFDOEXOOHWLQERDUGGHVLJQREMHFWVFDQUHSUHVHQWQRWMXVWXVHUVEXWDOVRPHVVDJHVDQGWKUHDGV$XVHUREMHFWKDVDXVHUQDPHDQGSDVVZRUGIRUWKDWXVHUDQGFRGHWRLGHQWLI\DOOWKHPHVVDJHVE\WKDWDXWKRU$PHVVDJHREMHFWNQRZVZKLFKWKUHDGLWEHORQJVWRDQGKDVFRGHWRSRVWDQHZPHVVDJHUHSO\WRDQH[LVWLQJPHVVDJHDQGGLVSOD\PHVVDJHV$WKUHDGREMHFWLVDFROOHFWLRQRIPHVVDJHREMHFWVDQGLWKDVFRGHWRGLVSOD\DWKUHDGLQGH[7KLVLVRQO\RQHZD\RIGLYLGLQJWKHQHFHVVDU\IXQFWLRQDOLW\LQWRREMHFWVWKRXJK)RULQVWDQFHLQDQDOWHUQDWHGHVLJQWKHFRGHWRSRVWDQHZPHVVDJHOLYHVLQWKHXVHUREMHFWQRWWKHPHVVDJHREMHFW'HVLJQLQJREMHFWRULHQWHGV\VWHPVLVDFRPSOH[WRSLFDQGPDQ\ERRNVKDYHEHHQZULWWHQRQLW7KHJRRGQHZVLVWKDWKRZHYHU\RXGHVLJQ\RXUV\VWHP\RXFDQLPSOHPHQWLWLQ3+37KHREMHFWDVXQLRQRIFRGHDQGGDWDLVWKHPRGXODUXQLWIRUDSSOLFDWLRQGHYHORSPHQWDQGFRGHUHXVH7KLVFKDSWHUVKRZV\RXKRZWRGHILQHFUHDWHDQGXVHREMHFWVLQ3+3,WFRYHUVEDVLF223FRQFHSWVDVZHOODVDGYDQFHGWRSLFVVXFKDV LQWURVSHFWLRQDQGVHULDOL]DWLRQ

    147

  • Terminology(YHU\REMHFWRULHQWHGODQJXDJHVHHPVWRKDYHDGLIIHUHQWVHWRIWHUPVIRUWKHVDPHROGFRQFHSWV7KLVVHFWLRQGHVFULEHVWKHWHUPVWKDW3+3XVHVEXWEHZDUQHGWKDWLQRWKHUODQJXDJHVWKHVHWHUPVPD\KDYHRWKHUPHDQLQJV/HWVUHWXUQWRWKHH[DPSOHRIWKHXVHUVRIDEXOOHWLQERDUG
  • $rasmus = new Person;

    'RQRWTXRWHWKHFODVVQDPHRU\RXOOJHWDFRPSLODWLRQHUURU$rasmus = new "Person"; // does not work

    6RPHFODVVHVSHUPLW\RXWRSDVVDUJXPHQWVWRWKHnewFDOO7KHFODVVVGRFXPHQWDWLRQVKRXOGVD\ZKHWKHULWDFFHSWVDUJXPHQWV,ILWGRHV\RXOOFUHDWHREMHFWVOLNHWKLV

    $object = new Person("Fred", 35);

    7KHFODVVQDPHGRHVQRWKDYHWREHKDUGFRGHGLQWR\RXUSURJUDPinit(50000, 1.10); // same as $account->init

    Accessing Properties and Methods2QFH\RXKDYHDQREMHFW\RXFDQXVHWKH->QRWDWLRQWRDFFHVVPHWKRGVDQGSURSHUWLHVRIWKHREMHFW

    $object->propertyname $object->methodname([arg, ... ])

    )RUH[DPSOHecho "Rasmus is {$rasmus->age} years old.\n"; // property access$rasmus->birthday(); // method call$rasmus->setAge(21); // method call with arguments

    0HWKRGVDFWWKHVDPHDVIXQFWLRQVRQO\VSHFLILFDOO\WRWKHREMHFWLQTXHVWLRQVRWKH\FDQWDNHDUJXPHQWVDQGUHWXUQDYDOXH

    $clan = $rasmus->family("extended");

    :LWKLQDFODVVVGHILQLWLRQ\RXFDQVSHFLI\ZKLFKPHWKRGVDQGSURSHUWLHVDUHSXEOLFO\DFFHVVLEOHDQGZKLFKDUHDFFHVVLEOHRQO\IURPZLWKLQWKHFODVVLWVHOIXVLQJWKHSXEOLFDQGSULYDWHDFFHVVPRGLILHUV

  • $VWDWLFPHWKRGLVRQHWKDWLVFDOOHGRQDFODVVQRWRQDQREMHFW6XFKPHWKRGVFDQQRWDFFHVVSURSHUWLHV7KHQDPHRIDVWDWLFPHWKRGLVWKHFODVVQDPHIROORZHGE\WZRFRORQVDQGWKHIXQFWLRQQDPH)RULQVWDQFHWKLVFDOOVWKHp()VWDWLFPHWKRGLQWKH+70/FODVV

    HTML::p("Hello, world");

    :KHQGHFODULQJDFODVV\RXGHILQHZKLFKSURSHUWLHVDQGPHWKRGVDUHVWDWLFXVLQJWKHVWDWLFDFFHVVSURSHUW\2QFHFUHDWHGREMHFWVDUHSDVVHGE\UHIHUHQFHWKDWLVLQVWHDGRIFRS\LQJDURXQGWKHHQWLUHREMHFWLWVHOIDWLPHDQGPHPRU\FRQVXPLQJHQGHDYRUDUHIHUHQFHWRWKHREMHFWLVSDVVHGDURXQGLQVWHDG)RUH[DPSOH

    $f = new Person("Fred", 35);

    $b = $f; // $b and $f point at same object$b->setName("Barney");

    printf("%s and %s are best friends.\n", $b->getName(), $f->getName());

    Barney and Barney are best friends.

    ,I\RXZDQWWRFUHDWHDWUXHFRS\RIDQREMHFW\RXXVHWKHFORQHRSHUDWRU$f = new Person("Fred", 35);

    $b = clone $f; // make a copy$b->setName("Barney");// change the copy

    printf("%s and %s are best friends.\n", $b->getName(), $f->getName());

    Fred and Barney are best friends.

    :KHQ\RXXVHWKHFORQHRSHUDWRUWRFUHDWHDFRS\RIDQREMHFWDQGWKDWFODVVGHFODUHVWKH__clone()PHWKRGWKDWPHWKRGLVFDOOHGRQWKHQHZREMHFWLPPHGLDWHO\DIWHULWVFORQHG

  • [ function functionname (args) { // code } ... ]}

    Declaring Methods$PHWKRGLVDIXQFWLRQGHILQHGLQVLGHDFODVV$OWKRXJK3+3LPSRVHVQRVSHFLDOUHVWULFWLRQVPRVWPHWKRGVDFWRQO\RQGDWDZLWKLQWKHREMHFWLQZKLFKWKHPHWKRGUHVLGHV0HWKRGQDPHVEHJLQQLQJZLWKWZRXQGHUVFRUHV__PD\EHXVHGLQWKHIXWXUHE\3+3DQG DUH FXUUHQWO\ XVHG IRU WKH REMHFW VHULDOL]DWLRQ PHWKRGV __sleep() DQG__wakeup()GHVFULEHGODWHULQWKLVFKDSWHUDPRQJRWKHUVVRLWVUHFRPPHQGHGWKDW\RXGRQRWEHJLQ\RXUPHWKRGQDPHVZLWKWKLVVHTXHQFH:LWKLQDPHWKRGWKH$thisYDULDEOHFRQWDLQVDUHIHUHQFHWRWKHREMHFWRQZKLFKWKHPHWKRGZDV FDOOHG )RU LQVWDQFH LI \RX FDOO $rasmus->birthday() LQVLGH WKH birthday()PHWKRG$thisKROGVWKHVDPHYDOXHDV$rasmus0HWKRGVXVHWKH$thisYDULDEOHWRDFFHVVWKHSURSHUWLHVRIWKHFXUUHQWREMHFWDQGWRFDOORWKHUPHWKRGVRQWKDWREMHFW+HUHVDVLPSOHFODVVGHILQLWLRQRI WKHPersonFODVV WKDWVKRZVWKH$thisYDULDEOH LQDFWLRQ

    class Person{ public $name = '';

    function getName() { return $this->name; }

    function setName($newName) { $this->name = $newName; }}

    $V\RXFDQVHHWKHgetName()DQGsetName()PHWKRGVXVH$thisWRDFFHVVDQGVHWWKH$nameSURSHUW\RIWKHFXUUHQWREMHFW7RGHFODUHDPHWKRGDVDVWDWLFPHWKRGXVHWKHVWDWLFNH\ZRUG,QVLGHRIVWDWLFPHWKRGVWKHYDULDEOH$thisLVQRWGHILQHG)RUH[DPSOH

    class HTMLStuff{ static function startTable() { echo "\n"; }

    Declaring a Class | 151

  • static function endTable() { echo "\n"; }}

    HTMLStuff::startTable(); // print HTML table rows and columnsHTMLStuff::endTable();

    ,I \RX GHFODUH DPHWKRG XVLQJ WKH final NH\ZRUG VXEFODVVHV FDQQRW RYHUULGH WKDWPHWKRG)RUH[DPSOH

    class Person{ public $name;

    final function getName() { return $this->name; }}

    class Child extends Person{ // syntax error function getName() { // do something }}

    8VLQJDFFHVVPRGLILHUV\RXFDQFKDQJHWKHYLVLELOLW\RIPHWKRGV0HWKRGVWKDWDUHDFFHVVLEOHRXWVLGHPHWKRGVRQWKHREMHFWVKRXOGEHGHFODUHGpublicPHWKRGVRQDQLQVWDQFHWKDWFDQRQO\EHFDOOHGE\PHWKRGVZLWKLQWKHVDPHFODVVVKRXOGEHGHFODUHGprivate)LQDOO\PHWKRGVGHFODUHGDVprotectedFDQRQO\EHFDOOHGIURPZLWKLQWKHREMHFWVFODVVPHWKRGVDQGWKHFODVVPHWKRGVRIFODVVHVLQKHULWLQJIURPWKHFODVV'HILQLQJWKHYLVLELOLW\RIFODVVPHWKRGVLVRSWLRQDOLIDYLVLELOLW\LVQRWVSHFLILHGDPHWKRGLVSXEOLF)RUH[DPSOH\RXPLJKWGHILQH

    class Person{ public $age;

    public function __construct() { $this->age = 0; }

    public function incrementAge() { $this->age += 1; $this->ageChanged(); }

    152 | Chapter 6:Objects

  • protected function decrementAge() { $this->age = 1; $this->ageChanged(); }

    private function ageChanged() { echo "Age changed to {$this->age}"; }}

    class SupernaturalPerson{ public function incrementAge() { // ages in reverse $this->decrementAge(); }}

    $person = new Person;$person->incrementAge();$person->decrementAge(); // not allowed$person->ageChanged(); // also not allowed

    $person = new SupernaturalPerson;$person->incrementAge(); // calls decrementAge under the hood

  • return $this->name; }

    function setName($newName) { $this->name = $newName; }}

  • IRUWKHSURSHUW\WKDWUHDGDQGZULWHWKHGDWDZKHQHYHUUHTXHVWHG$QRWKHUPHWKRGPLJKWEHWRXVHWKHVHRYHUORDGLQJPHWKRGV

    class Person{ public function __get($property) { if ($property === 'biography') { $biography = "long text here..."; // would retrieve from database

    return $biography; } }

    public function __set($property, $value) { if ($property === 'biography') { // set the value in the database } }}

    Declaring Constants/LNHJOREDOFRQVWDQWVDVVLJQHGWKURXJKWKHdefine()IXQFWLRQ3+3SURYLGHVDZD\WRDVVLJQFRQVWDQWVZLWKLQDFODVV/LNHVWDWLFSURSHUWLHVFRQVWDQWVFDQEHDFFHVVHGGLUHFWO\WKURXJKWKHFODVVRUZLWKLQREMHFWPHWKRGVXVLQJWKHselfQRWDWLRQ2QFHDFRQVWDQWLVGHILQHGLWVYDOXHFDQQRWEHFKDQJHG

    class PaymentMethod{ const TYPE_CREDITCARD = 0; const TYPE_CASH = 1;}

    echo PaymentMethod::TYPE_CREDITCARD;

    0

    $VZLWKJOREDOFRQVWDQWVLWLVFRPPRQSUDFWLFHWRGHILQHFODVVFRQVWDQWVZLWKXSSHUFDVHLGHQWLILHUV

    Inheritance7RLQKHULWWKHSURSHUWLHVDQGPHWKRGVIURPDQRWKHUFODVVXVHWKHextendsNH\ZRUGLQWKHFODVVGHILQLWLRQIROORZHGE\WKHQDPHRIWKHEDVHFODVV

    class Person{ public $name, $address, $age;}

    class Employee extends Person

    Declaring a Class | 155

  • { public $position, $salary;}

    7KHEmployeeFODVVFRQWDLQVWKH$positionDQG$salarySURSHUWLHVDVZHOODVWKH$name$addressDQG$ageSURSHUWLHVLQKHULWHGIURPWKHPersonFODVV,IDGHULYHGFODVVKDVDSURSHUW\RUPHWKRGZLWKWKHVDPHQDPHDVRQHLQLWVSDUHQWFODVVWKHSURSHUW\RUPHWKRGLQWKHGHULYHGFODVVWDNHVSUHFHGHQFHRYHUWKHSURSHUW\RUPHWKRGLQWKHSDUHQWFODVV5HIHUHQFLQJWKHSURSHUW\UHWXUQVWKHYDOXHRIWKHSURSHUW\RQWKHFKLOGZKLOHUHIHUHQFLQJWKHPHWKRGFDOOVWKHPHWKRGRQWKHFKLOG7R DFFHVV DQ RYHUULGGHQ PHWKRG RQ DQ REMHFWV SDUHQW FODVV XVH WKH parent::method()QRWDWLRQ

    parent::birthday(); // call parent class's birthday() method

    $FRPPRQPLVWDNHLVWRKDUGFRGHWKHQDPHRIWKHSDUHQWFODVVLQWRFDOOVWRRYHUULGGHQPHWKRGV

    Creature::birthday(); // when Creature is the parent class

    7KLVLVDPLVWDNHEHFDXVHLWGLVWULEXWHVNQRZOHGJHRIWKHSDUHQWFODVVVQDPHWKURXJKRXWWKHGHULYHGFODVV8VLQJparent::FHQWUDOL]HVWKHNQRZOHGJHRIWKHSDUHQWFODVVLQWKHextendsFODXVH,IDPHWKRGPLJKWEHVXEFODVVHGDQG\RXZDQWWRHQVXUHWKDW\RXUHFDOOLQJLWRQWKHFXUUHQWFODVVXVHWKHself::method()QRWDWLRQ

    self::birthday(); // call this class's birthday() method

    7RFKHFNLIDQREMHFWLVDQLQVWDQFHRIDSDUWLFXODUFODVVRULILWLPSOHPHQWVDSDUWLFXODULQWHUIDFH VHH WKH VHFWLRQ ,QWHUIDFHV RQ SDJH \RX FDQ XVH WKH instanceofRSHUDWRU

    if ($object instanceof Animal) { // do something}

    Interfaces,QWHUIDFHVSURYLGHDZD\IRUGHILQLQJFRQWUDFWVWRZKLFKDFODVVDGKHUHVWKHLQWHUIDFHSURYLGHVPHWKRGSURWRW\SHVDQGFRQVWDQWVDQGDQ\FODVVWKDWLPSOHPHQWVWKHLQWHUIDFHPXVWSURYLGHLPSOHPHQWDWLRQVIRUDOOPHWKRGVLQWKHLQWHUIDFH+HUHVWKHV\QWD[IRUDQLQWHUIDFHGHILQLWLRQ

    interface interfacename{ [ function functionname(); ... ]}

    156 | Chapter 6:Objects

  • 7RGHFODUHWKDWDFODVVLPSOHPHQWVDQLQWHUIDFHLQFOXGHWKHimplementsNH\ZRUGDQGDQ\QXPEHURILQWHUIDFHVVHSDUDWHGE\FRPPDV

    interface Printable{ function printOutput();}

    class ImageComponent implements Printable{ function printOutput() { echo "Printing an image..."; }}

    $QLQWHUIDFHPD\LQKHULWIURPRWKHULQWHUIDFHVLQFOXGLQJPXOWLSOHLQWHUIDFHVDVORQJDVQRQHRIWKHLQWHUIDFHVLWLQKHULWVIURPGHFODUHPHWKRGVZLWKWKHVDPHQDPHDVWKRVHGHFODUHGLQWKHFKLOGLQWHUIDFH

    Traits7UDLWVSURYLGHDPHFKDQLVPIRUUHXVLQJFRGHRXWVLGHRIDFODVVKLHUDUFK\7UDLWVDOORZ\RXWRVKDUHIXQFWLRQDOLW\DFURVVGLIIHUHQWFODVVHVWKDWGRQWDQGVKRXOGQWVKDUHDFRPPRQDQFHVWRULQDFODVVKLHUDUFK\+HUHVWKHV\QWD[IRUDWUDLWGHILQLWLRQ

    trait traitname [ extends baseclass ]{ [ use traitname, [ traitname, ... ]; ]

    [ visibility $property [ = value ]; ... ]

    [ function functionname (args) { // code } ... ]}

    7RGHFODUHWKDWDFODVVVKRXOGLQFOXGHDWUDLWVPHWKRGVLQFOXGHWKHuseNH\ZRUGDQGDQ\QXPEHURIWUDLWVVHSDUDWHGE\FRPPDV

    trait Logger{ public log($logString) { $className = __CLASS__; echo date("Y-m-d h:i:s", time()) . ": [{$className}] {$logString}"; }}

    class User{ use Logger;

    Declaring a Class | 157

  • public $name;

    function __construct($name = '') { $this->name = $name; $this->log("Created user '{$this->name}'"); }

    function __toString() { return $this->name; }}

    class UserGroup{ use Logger;

    public $users = array();

    public addUser(User $user) { if (!$this->includesUser($user)) { $this->users[] = $user; $this->log("Added user '{$user}' to group"); } }}

    $group = new UserGroup;$group->addUser(new User("Franklin"));

    2012-03-09 07:12:58: [User] Created user 'Franklin'2012-03-09 07:12:58: [UserGroup] Added user 'Franklin' to group

    7KHPHWKRGVGHILQHGE\WKHLoggerWUDLWDUHDYDLODEOHWRLQVWDQFHVRIWKHUserGroupFODVVDVLIWKH\ZHUHGHILQHGLQWKDWFODVV7UDLWVFDQEHFRPSRVHGRIRWKHU WUDLWVE\ LQFOXGLQJ WKHuse VWDWHPHQW LQ WKH WUDLWVGHFODUDWLRQIROORZHGE\RQHRUPRUHWUDLWQDPHVVHSDUDWHGE\FRPPDVDVVKRZQKHUH

    trait First{ public doFirst() { echo "first\n"; }}

    trait Second{ public doSecond() { echo "second\n"; }

    158 | Chapter 6:Objects

  • }trait Third{ use First, Second;

    public doAll() { $this->doFirst(); $this->doSecond(); }}

    class Combined{ use Third;}

    $object = new Combined;$object->doAll();

    firstsecond

    7UDLWVFDQGHFODUHDEVWUDFWPHWKRGV,IDFODVVXVHVPXOWLSOHWUDLWVGHILQLQJWKHVDPHPHWKRG3+3JLYHVDIDWDOHUURU+RZHYHU\RXFDQRYHUULGHWKLVEHKDYLRUE\WHOOLQJWKHFRPSLOHUVSHFLILFDOO\ZKLFKLPSOHPHQWDWLRQRI D JLYHQPHWKRG\RXZDQW WRXVH:KHQGHILQLQJZKLFK WUDLWV D FODVVLQFOXGHVXVHWKHinsteadofNH\ZRUGIRUHDFKFRQIOLFW

    trait Command{ function run() { echo "Executing a command\n"; }}

    trait Marathon{ function run() { echo "Running a marathon\n"; }}

    class Person{ use Command, Marathon { Marathon::run insteadof Command; }}

    $person = new Person;

    Declaring a Class | 159

  • $person->run();

    Running a marathon

    ,QVWHDGRISLFNLQJMXVWRQHPHWKRGWRLQFOXGH\RXFDQXVHWKHasNH\ZRUGWRDOLDVDWUDLWVPHWKRGZLWKLQDFODVVLQFOXGLQJLWWRDGLIIHUHQWQDPHrun();$person->runCommand();

    Running a marathonExecuting a command

    Abstract Methods3+3DOVRSURYLGHVDPHFKDQLVPIRUGHFODULQJWKDWFHUWDLQPHWKRGVRQWKHFODVVPXVWEHLPSOHPHQWHGE\VXEFODVVHVWKHLPSOHPHQWDWLRQRIWKRVHPHWKRGVLVQRWGHILQHGLQWKHSDUHQWFODVV,QWKHVHFDVHV\RXSURYLGHDQDEVWUDFWPHWKRGLQDGGLWLRQLIDFODVVKDVDQ\PHWKRGVLQLWGHILQHGDVDEVWUDFW\RXPXVWDOVRGHFODUHWKHFODVVDVDQDEVWUDFWFODVV

    abstract class Component{ abstract function printOutput();}

    class ImageComponent extends Component{

    160 | Chapter 6:Objects

  • function printOutput() { echo "Pretty picture"; }}

    $EVWUDFW FODVVHV FDQQRWEH LQVWDQWLDWHG$OVRQRWH WKDWXQOLNH VRPH ODQJXDJHV \RXFDQQRWSURYLGHDGHIDXOWLPSOHPHQWDWLRQIRUDEVWUDFWPHWKRGV7UDLWVFDQDOVRGHFODUHDEVWUDFWPHWKRGV&ODVVHVWKDWLQFOXGHDWUDLWWKDWGHILQHVDQDEVWUDFWPHWKRGPXVWLPSOHPHQWWKDWPHWKRG

    trait Sortable{ abstract function uniqueId();

    function compareById($object) { return ($object->uniqueId() < $this->uniqueId()) ? 1 : 1; }}

    class Bird{ use Sortable;

    function uniqueId() { return __CLASS__ . ":{$this->id}"; }}

    class Car{ use Sortable;}

    // this will fatal$bird = new Bird;$car = new Car;$comparison = $bird->compareById($card);

    :KHQLPSOHPHQWLQJDQDEVWUDFWPHWKRGLQDFKLOGFODVVWKHPHWKRGVLJQDWXUHVPXVWPDWFKWKDWLVWKH\PXVWWDNHLQWKHVDPHQXPEHURIUHTXLUHGSDUDPHWHUVDQGLIDQ\RIWKHSDUDPHWHUVKDYHW\SHKLQWVWKRVHW\SHKLQWVPXVWPDWFK,QDGGLWLRQWKHPHWKRGPXVWKDYHWKHVDPHRUOHVVUHVWULFWHGYLVLELOLW\

    Constructors

  • 7KHVHDUJXPHQWVDUHSDVVHGWRWKHFODVVVFRQVWUXFWRUDVSHFLDOIXQFWLRQWKDWLQLWLDOL]HVWKHSURSHUWLHVRIWKHFODVV$FRQVWUXFWRULVDIXQFWLRQLQWKHFODVVFDOOHG__construct()+HUHVDFRQVWUXFWRUIRUWKHPersonFODVV

    class Person{ function __construct($name, $age) { $this->name = $name; $this->age = $age; }}

    3+3GRHVQRWSURYLGHIRUDQDXWRPDWLFFKDLQRIFRQVWUXFWRUVWKDWLVLI\RXLQVWDQWLDWHDQREMHFWRIDGHULYHGFODVVRQO\WKHFRQVWUXFWRULQWKHGHULYHGFODVVLVDXWRPDWLFDOO\FDOOHG)RUWKHFRQVWUXFWRURIWKHSDUHQWFODVVWREHFDOOHGWKHFRQVWUXFWRULQWKHGHULYHGFODVVPXVWH[SOLFLWO\FDOOWKHFRQVWUXFWRU,QWKLVH[DPSOHWKHEmployeeFODVVFRQVWUXFWRUFDOOVWKHPersonFRQVWUXFWRU

    class Person{ public $name, $address, $age;

    function __construct($name, $address, $age) { $this->name = $name; $this->address = $address; $this->age = $age; }}

    class Employee extends Person{ public $position, $salary;

    function __construct($name, $address, $age, $position, $salary) { parent::__construct($name, $address, $age);

    $this->position = $position; $this->salary = $salary; }}

    Destructors:KHQDQREMHFWLVGHVWUR\HGVXFKDVZKHQWKHODVWUHIHUHQFHWRDQREMHFWLVUHPRYHGRUWKHHQGRIWKHVFULSWLVUHDFKHGLWVGHVWUXFWRULVFDOOHG%HFDXVH3+3DXWRPDWLFDOO\FOHDQVXSDOOUHVRXUFHVZKHQWKH\IDOORXWRIVFRSHDQGDWWKHHQGRIDVFULSWVH[HFXWLRQWKHLUDSSOLFDWLRQLVOLPLWHG7KHGHVWUXFWRULVDPHWKRGFDOOHG__destruct()

    162 | Chapter 6:Objects

  • class Building{ function __destruct() { echo "A Building is being destroyed!"; }}

    Introspection,QWURVSHFWLRQLVWKHDELOLW\RIDSURJUDPWRH[DPLQHDQREMHFWVFKDUDFWHULVWLFVVXFKDVLWVQDPHSDUHQWFODVVLIDQ\SURSHUWLHVDQGPHWKRGV:LWKLQWURVSHFWLRQ\RXFDQZULWHFRGHWKDWRSHUDWHVRQDQ\FODVVRUREMHFW

  • 8VHget_parent_class()WRILQGDFODVVVSDUHQWFODVV$superclass = get_parent_class(classname);

    ([DPSOHOLVWVWKHdisplay_classes()IXQFWLRQZKLFKGLVSOD\VDOOFXUUHQWO\GHFODUHGFODVVHVDQGWKHPHWKRGVDQGSURSHUWLHVIRUHDFK([DPSOH'LVSOD\LQJDOOGHFODUHGFODVVHVfunction displayClasses(){ $classes = get_declared_classes();

    foreach ($classes as $class) { echo "Showing information about {$class}"; echo "Class methods:";

    $methods = get_class_methods($class);

    if (!count($methods)) { echo "None"; } else { foreach ($methods as $method) { echo "{$method}()"; } }

    echo "Class properties:";

    $properties = get_class_vars($class);

    if (!count($properties)) { echo "None"; } else { foreach(array_keys($properties) as $property) { echo "\${$property}"; } }

    echo ""; }}

    Examining an Object7RJHWWKHFODVVWRZKLFKDQREMHFWEHORQJVILUVWPDNHVXUHLWLVDQREMHFWXVLQJWKHis_object()IXQFWLRQDQGWKHQJHWWKHFODVVZLWKWKHget_class()IXQFWLRQ

    $isObject = is_object(var);$classname = get_class(object);

    %HIRUH FDOOLQJ D PHWKRG RQ DQ REMHFW \RX FDQ HQVXUH WKDW LW H[LVWV XVLQJ WKHmethod_exists()IXQFWLRQ

    164 | Chapter 6:Objects

  • $methodExists = method_exists(object, method);

    &DOOLQJDQXQGHILQHGPHWKRGWULJJHUVDUXQWLPHH[FHSWLRQ-XVWDVget_class_vars()UHWXUQVDQDUUD\RISURSHUWLHVIRUDFODVVget_object_vars()UHWXUQVDQDUUD\RISURSHUWLHVVHWLQDQREMHFW

    $array = get_object_vars(object);

    $QG MXVW DV get_class_vars() UHWXUQV RQO\ WKRVH SURSHUWLHV ZLWK GHIDXOW YDOXHVget_object_vars()UHWXUQVRQO\WKRVHSURSHUWLHVWKDWDUHVHW

    class Person{ public $name; public $age;}

    $fred = new Person;$fred->name = "Fred";$props = get_object_vars($fred); // array('name' => "Fred", 'age' => NULL);

    7KHget_parent_class()IXQFWLRQDFFHSWVHLWKHUDQREMHFWRUDFODVVQDPH,WUHWXUQVWKHQDPHRIWKHSDUHQWFODVVRUFALSELIWKHUHLVQRSDUHQWFODVV

    class A {}class B extends A {}

    $obj = new B;echo get_parent_class($obj);echo get_parent_class(B);

    AA

    Sample Introspection Program([DPSOHVKRZVDFROOHFWLRQRIIXQFWLRQVWKDWGLVSOD\DUHIHUHQFHSDJHRILQIRUPDWLRQDERXWDQREMHFWVSURSHUWLHVPHWKRGVDQGLQKHULWDQFHWUHH([DPSOH2EMHFWLQWURVSHFWLRQIXQFWLRQV// return an array of callable methods (include inherited methods)function getCallableMethods($object){ $methods = get_class_methods(get_class($object));

    if (get_parent_class($object)) { $parent_methods = get_class_methods(get_parent_class($object)); $methods = array_diff($methods, $parent_methods); }

    return $methods;}

    Introspection | 165

  • // return an array of inherited methodsfunction getInheritedMethods($object){ $methods = get_class_methods(get_class($object));

    if (get_parent_class($object)) { $parentMethods = get_class_methods(get_parent_class($object)); $methods = array_intersect($methods, $parentMethods); }

    return $methods;}

    // return an array of superclassesfunction getLineage($object){ if (get_parent_class($object)) { $parent = get_parent_class($object); $parentObject = new $parent;

    $lineage = getLineage($parentObject); $lineage[] = get_class($object); } else { $lineage = array(get_class($object)); }

    return $lineage;}

    // return an array of subclassesfunction getChildClasses($object){ $classes = get_declared_classes();

    $children = array();

    foreach ($classes as $class) { if (substr($class, 0, 2) == '__') { continue; }

    $child = new $class;

    if (get_parent_class($child) == get_class($object)) { $children[] = $class; } }

    return $children;}

    // display information on an objectfunction printObjectInfo($object){

    166 | Chapter 6:Objects

  • $class = get_class($object); echo "Class"; echo "{$class}";

    echo "Inheritance";

    echo "Parents"; $lineage = getLineage($object); array_pop($lineage);

    if (count($lineage) > 0) { echo "" . join(" -> ", $lineage) . ""; } else { echo "None"; }

    echo "Children"; $children = getChildClasses($object); echo "";

    if (count($children) > 0) { echo join(', ', $children); } else { echo "None"; }

    echo "";

    echo "Methods"; $methods = getCallableMethods($class); $object_methods = get_methods($object);

    if (!count($methods)) { echo "None"; } else { echo 'Inherited methods are in italics.';

    foreach($methods as $method) { if (in_array($method, $object_methods)) { echo "{$method}();"; } else { echo "{$method}();"; } } }

    echo "Properties"; $properties = get_class_vars($class);

    if (!count($properties)) { echo "None";

    Introspection | 167

  • } else { foreach(array_keys($properties) as $property) { echo "\${$property} = " . $object->$property . ""; } }

    echo "";}

    +HUHDUHVRPHVDPSOHFODVVHVDQGREMHFWVWKDWH[HUFLVHWKHLQWURVSHFWLRQIXQFWLRQVIURP([DPSOH

    class A{ public $foo = "foo"; public $bar = "bar"; public $baz = 17.0;

    function firstFunction() { }

    function secondFunction() { }}

    class B extends A{ public $quux = false;

    function thirdFunction() { }}

    class C extends B{}

    $a = new A;$a->foo = "sylvie";$a->bar = 23;

    $b = new B;$b->foo = "bruno";$b->quux = true;

    $c = new C;

    printObjectInfo($a);printObjectInfo($b);printObjectInfo($c);

    168 | Chapter 6:Objects

  • Serialization6HULDOL]LQJDQREMHFWPHDQVFRQYHUWLQJLWWRDE\WHVWUHDPUHSUHVHQWDWLRQWKDWFDQEHVWRUHGLQDILOH7KLVLVXVHIXOIRUSHUVLVWHQWGDWDIRUH[DPSOH3+3VHVVLRQVDXWRPDWLFDOO\VDYHDQGUHVWRUHREMHFWV6HULDOL]DWLRQLQ3+3LVPRVWO\DXWRPDWLFLWUHTXLUHVOLWWOHH[WUDZRUNIURP\RXEH\RQGFDOOLQJWKHserialize()DQGunserialize()IXQFWLRQV

    $encoded = serialize(something);$something = unserialize(encoded);

    6HULDOL]DWLRQLVPRVWFRPPRQO\XVHGZLWK3+3VVHVVLRQVZKLFKKDQGOHWKHVHULDOL]DWLRQIRU\RX$OO\RXQHHGWRGRLVWHOO3+3ZKLFKYDULDEOHVWRNHHSWUDFNRIDQGWKH\UHDXWRPDWLFDOO\SUHVHUYHGEHWZHHQYLVLWVWRSDJHVRQ\RXUVLWH+RZHYHUVHVVLRQVDUHQRWWKHRQO\XVHRIVHULDOL]DWLRQLI\RXZDQWWRLPSOHPHQW\RXURZQIRUPRISHUVLVWHQWREMHFWVserialize()DQGunserialize()DUHDQDWXUDOFKRLFH$QREMHFWVFODVVPXVWEHGHILQHGEHIRUHXQVHULDOL]DWLRQFDQRFFXU$WWHPSWLQJWRXQVHULDOL]HDQREMHFWZKRVHFODVVLVQRW\HWGHILQHGSXWVWKHREMHFWLQWRstdClassZKLFKUHQGHUV LW DOPRVWXVHOHVV2QHSUDFWLFDO FRQVHTXHQFHRI WKLV LV WKDW LI \RXXVH3+3VHVVLRQVWRDXWRPDWLFDOO\VHULDOL]HDQGXQVHULDOL]HREMHFWV\RXPXVW LQFOXGHWKHILOHFRQWDLQLQJWKHREMHFWVFODVVGHILQLWLRQLQHYHU\SDJHRQ\RXUVLWH)RUH[DPSOH\RXUSDJHVPLJKWVWDUWOLNHWKLV

    include "object_definitions.php"; // load object definitionssession_start(); // load persistent variables?>...

    3+3KDVWZRKRRNVIRUREMHFWVGXULQJWKHVHULDOL]DWLRQDQGXQVHULDOL]DWLRQSURFHVV__sleep()DQG__wakeup()7KHVHPHWKRGVDUHXVHGWRQRWLI\REMHFWVWKDWWKH\UHEHLQJVHULDOL]HGRUXQVHULDOL]HG2EMHFWVFDQEHVHULDOL]HGLIWKH\GRQRWKDYHWKHVHPHWKRGVKRZHYHUWKH\ZRQWEHQRWLILHGDERXWWKHSURFHVV7KH__sleep()PHWKRGLVFDOOHGRQDQREMHFWMXVWEHIRUHVHULDOL]DWLRQLWFDQSHUIRUPDQ\FOHDQXSQHFHVVDU\WRSUHVHUYHWKHREMHFWVVWDWHVXFKDVFORVLQJGDWDEDVHFRQQHFWLRQVZULWLQJRXWXQVDYHGSHUVLVWHQWGDWDDQGVRRQ,WVKRXOGUHWXUQDQDUUD\FRQWDLQLQJWKHQDPHVRIWKHGDWDPHPEHUVWKDWQHHGWREHZULWWHQLQWRWKHE\WHVWUHDP,I\RXUHWXUQDQHPSW\DUUD\QRGDWDLVZULWWHQ&RQYHUVHO\WKH__wakeup()PHWKRGLVFDOOHGRQDQREMHFWLPPHGLDWHO\DIWHUDQREMHFWLVFUHDWHGIURPDE\WHVWUHDP7KHPHWKRGFDQWDNHDQ\DFWLRQLWUHTXLUHVVXFKDVUHRSHQLQJGDWDEDVHFRQQHFWLRQVDQGRWKHULQLWLDOL]DWLRQWDVNV([DPSOHLVDQREMHFWFODVVLogWKDWSURYLGHVWZRXVHIXOPHWKRGVwrite()WRDSSHQGDPHVVDJHWRWKHORJILOHDQGread()WRIHWFKWKHFXUUHQWFRQWHQWVRIWKHORJILOH,WXVHV__wakeup()WRUHRSHQWKHORJILOHDQG__sleep()WRFORVHWKHORJILOH

    Serialization | 169

  • ([DPSOH7KH/RJSKSILOHclass Log{ private $filename; private $fh;

    function __construct($filename) { $this->filename = $filename; $this->open(); }

    function open() { $this->fh = fopen($this->filename, 'a') or die("Can't open {$this->filename}"); }

    function write($note) { fwrite($this->fh, "{$note}\n"); }

    function read() { return join('', file($this->filename)); }

    function __wakeup() { $this->open(); }

    function __sleep() { // write information to the account file fclose($this->fh);

    return array("filename"); }}

    6WRUHWKHLogFODVVGHILQLWLRQLQDILOHFDOOHG/RJLQF7KH+70/SDJHLQ([DPSOHXVHVWKHLogFODVVDQG3+3VHVVLRQVWRFUHDWHDSHUVLVWHQWORJYDULDEOH$logger([DPSOHIURQWSKS

    Front Page

    170 | Chapter 6:Objects

  • Move to the next page

    ([DPSOHVKRZVWKHILOHQH[WSKSDQ+70/SDJH)ROORZLQJWKHOLQNIURPWKHIURQWSDJHWRWKLVSDJHWULJJHUVWKHORDGLQJRIWKHSHUVLVWHQWREMHFW$logger7KH__wakeup()FDOOUHRSHQVWKHORJILOHVRWKHREMHFWLVUHDG\WREHXVHG([DPSOHQH[WSKS

    Next Page

    Serialization | 171