Top Banner
CHAPTER 6 Objects 147
26

Programming PHP

Oct 01, 2015

Download

Documents

vijayakumarmani

The document is download via internet
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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