- Clarification of syntax and some structuring

git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@132305 c90b9560-bf6c-de11-be94-00142212c4b1
This commit is contained in:
Derick Rethans 2003-06-18 10:55:03 +00:00
parent c83f0d38ac
commit 271c1898fc

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.42 $ -->
<!-- $Revision: 1.43 $ -->
<chapter id="language.oop">
<title>Classes and Objects</title>
@ -8,7 +8,8 @@
<para>
A class is a collection of variables and functions working with
these variables. A class is defined using the following syntax:
</para>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
@ -48,17 +49,43 @@ class Cart
items from this cart.
</para>
<caution>
<warning>
<simpara>
The following cautionary notes are valid for PHP 4.
You can <emphasis>NOT</emphasis> break up a class definition into
multiple files, or multiple PHP blocks. The following will not work:
</simpara>
<para>
<informalexample>
<programlisting>
<![CDATA[
<?php
class test {
?>
<?php
function test() {
print 'OK';
}
}
?>
]]>
</programlisting>
</informalexample>
</para>
</warning>
<simpara>
The following cautionary notes are valid for PHP 4.
</simpara>
<caution>
<simpara>
The name <literal>stdClass</literal> is used interally by
Zend and is reserved. You cannot have a class named
<literal>stdClass</literal> in PHP.
</simpara>
</caution>
<caution>
<simpara>
The function names <literal>__sleep</literal> and
<literal>__wakeup</literal> are magical in PHP classes. You
@ -66,7 +93,9 @@ class Cart
classes unless you want the magic functionality associated
with them. See below for more information.
</simpara>
</caution>
<caution>
<simpara>
PHP reserves all function names starting with __ as magical.
It is recommended that you do not use function names with
@ -74,16 +103,15 @@ class Cart
</simpara>
</caution>
<note>
<simpara>
In PHP 4, only constant initializers for <literal>var</literal>
variables are allowed. To initialize variables with non-constant
values, you need an initialization function which is called
automatically when an object is being constructed from the
class. Such a function is called a constructor (see below).
</simpara>
<informalexample>
<programlisting role="php">
<simpara>
In PHP 4, only constant initializers for <literal>var</literal>
variables are allowed. To initialize variables with non-constant
values, you need an initialization function which is called
automatically when an object is being constructed from the
class. Such a function is called a constructor (see below).
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
/* None of these will work in PHP 4. */
@ -112,9 +140,8 @@ class Cart
}
?>
]]>
</programlisting>
</informalexample>
</note>
</programlisting>
</informalexample>
<para>
Classes are types, that is, they are blueprints for actual
@ -137,29 +164,29 @@ $another_cart->add_item("0815", 3);
</informalexample>
<para>
This creates the objects $cart and $another_cart, both of
the class Cart. The function add_item() of the $cart object
is being called to add 1 item of article number 10 to the
$cart. 3 items of article number 0815 are being added to
$another_cart.
This creates the objects <varname>$cart</varname> and
<varname>$another_cart</varname>, both of the class Cart. The function
add_item() of the <varname>$cart</varname> object is being called to add 1
item of article number 10 to the <varname>$cart</varname>. 3 items of
article number 0815 are being added to <varname>$another_cart</varname>.
</para>
<para>
Both, $cart and $another_cart, have functions add_item(),
remove_item() and a variable items. These are distinct
functions and variables. You can think of the objects as
something similar to directories in a filesystem. In a
filesystem you can have two different files README.TXT, as
long as they are in different directories. Just like with
directories where you'll have to type the full pathname in
order to reach each file from the toplevel directory, you
have to specify the complete name of the function you want
to call: In PHP terms, the toplevel directory would be the
global namespace, and the pathname separator would be -&gt;.
Thus, the names $cart-&gt;items and $another_cart-&gt;items
name two different variables. Note that the variable is
named $cart-&gt;items, not $cart-&gt;$items, that is, a
variable name in PHP has only a single dollar sign.
Both, <varname>$cart</varname> and <varname>$another_cart</varname>, have
functions add_item(), remove_item() and a variable items. These are
distinct functions and variables. You can think of the objects as
something similar to directories in a filesystem. In a filesystem you can
have two different files README.TXT, as long as they are in different
directories. Just like with directories where you'll have to type the
full pathname in order to reach each file from the toplevel directory, you
have to specify the complete name of the function you want to call: In PHP
terms, the toplevel directory would be the global namespace, and the
pathname separator would be <literal>-&gt;</literal>. Thus, the names
<varname>$cart-&gt;items</varname> and
<varname>$another_cart-&gt;items</varname> name two different variables.
Note that the variable is named <varname>$cart-&gt;items</varname>, not
<varname>$cart-&gt;$items</varname>, that is, a variable name in PHP has
only a single dollar sign.
</para>
<informalexample>
@ -182,17 +209,19 @@ $cart->$myvar = array("10" => 1);
</informalexample>
<para>
Within a class definition, you do not know under which name the object will
be accessible in your program: at the time the Cart class was
written, it was unknown that the object will be named $cart or
$another_cart later. Thus, you cannot write $cart-&gt;items within
the Cart class itself. Instead, in order to be able to access it's own
functions and variables from within a class, one can use the
pseudo-variable $this which can be read as 'my own' or
'current object'. Thus, '$this-&gt;items[$artnr] += $num' can
be read as 'add $num to the $artnr counter of my own items
array' or 'add $num to the $artnr counter of the items array
within the current object'.
Within a class definition, you do not know under which name the object
will be accessible in your program: at the time the Cart class was
written, it was unknown that the object will be named
<varname>$cart</varname> or <varname>$another_cart</varname> later. Thus,
you cannot write <varname>$cart-&gt;items</varname> within the Cart class
itself. Instead, in order to be able to access it's own functions and
variables from within a class, one can use the pseudo-variable
<varname>$this</varname> which can be read as 'my own' or 'current
object'. Thus, '<varname>$this-&gt;items[$artnr]</varname> +=
<varname>$num</varname>' can be read as 'add <varname>$num</varname> to
the <varname>$artnr</varname> counter of my own items array' or 'add
<varname>$num</varname> to the <varname>$artnr</varname> counter of the
items array within the current object'.
</para>
<note>
@ -242,11 +271,11 @@ class Named_Cart extends Cart
</informalexample>
<para>
This defines a class Named_Cart that has all variables and
functions of Cart plus an additional variable $owner and an
additional function set_owner(). You create a named cart the usual
way and can now set and get the carts owner. You can still use
normal cart functions on named carts:
This defines a class Named_Cart that has all variables and functions of
Cart plus an additional variable <varname>$owner</varname> and an
additional function set_owner(). You create a named cart the usual way and
can now set and get the carts owner. You can still use normal cart
functions on named carts:
</para>
<informalexample>
@ -552,7 +581,7 @@ $b->example();
In fact, there is no object at all at the time of the call.
Thus, a class function may not use any object variables (but
it can use local and global variables), and it may no use
$this at all.
<varname>$this</varname> at all.
</para>
<para>
@ -566,9 +595,9 @@ $b->example();
</para>
<para>
In this context, there is a current object and it may
have object variables. Thus, when used from WITHIN an
object function, you may use $this and object variables.
In this context, there is a current object and it may have object
variables. Thus, when used from WITHIN an object function, you may use
<varname>$this</varname> and object variables.
</para>
</sect1>
@ -656,16 +685,15 @@ $b->example();
</para>
<para>
In order to be able to <function>unserialize</function> an
object, the class of that object needs to be defined. That
is, if you have an object $a of class A on page1.php and
serialize this, you'll get a string that refers to class A
and contains all values of variabled contained in $a. If
you want to be able to unserialize this on page2.php,
recreating $a of class A, the definition of class A must
be present in page2.php. This can be done for example
by storing the class defintion of class A in an include
file and including this file in both page1.php and page2.php.
In order to be able to <function>unserialize</function> an object, the
class of that object needs to be defined. That is, if you have an object
<varname>$a</varname> of class A on page1.php and serialize this, you'll
get a string that refers to class A and contains all values of variabled
contained in <varname>$a</varname>. If you want to be able to unserialize
this on page2.php, recreating <varname>$a</varname> of class A, the
definition of class A must be present in page2.php. This can be done for
example by storing the class defintion of class A in an include file and
including this file in both page1.php and page2.php.
</para>
<informalexample>
@ -731,10 +759,10 @@ $b->example();
</para>
<para>
So if in the example above $a became part of a session by
running <literal>session_register("a")</literal>, you should
include the file <literal>classa.inc</literal> on all of your
pages, not only page1.php and page2.php.
So if in the example above <varname>$a</varname> became part of a session
by running <literal>session_register("a")</literal>, you should include the
file <literal>classa.inc</literal> on all of your pages, not only page1.php
and page2.php.
</para>
</sect1>