<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>The Basics</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="oop5.intro.html">Introduction</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.oop5.properties.html">Properties</a></div> <div class="up"><a href="language.oop5.html">Classes and Objects</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><div id="language.oop5.basic" class="sect1"> <h2 class="title">The Basics</h2> <div class="sect2" id="language.oop5.basic.class"> <h3 class="title">class</h3> <p class="para"> Basic class definitions begin with the keyword <em>class</em>, followed by a class name, followed by a pair of curly braces which enclose the definitions of the properties and methods belonging to the class. </p> <p class="para"> The class name can be any valid label which is not a PHP <a href="reserved.html" class="link">reserved word</a>. A valid class name starts with a letter or underscore, followed by any number of letters, numbers, or underscores. As a regular expression, it would be expressed thus: <em>^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$</em>. </p> <p class="para"> A class may contain its own <a href="language.oop5.constants.html" class="link">constants</a>, <a href="language.oop5.properties.html" class="link">variables</a> (called "properties"), and functions (called "methods"). </p> <div class="example" id="example-169"> <p><strong>Example #1 Simple Class definition</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">SimpleClass<br /></span><span style="color: #007700">{<br /> </span><span style="color: #FF8000">// property declaration<br /> </span><span style="color: #007700">public </span><span style="color: #0000BB">$var </span><span style="color: #007700">= </span><span style="color: #DD0000">'a default value'</span><span style="color: #007700">;<br /><br /> </span><span style="color: #FF8000">// method declaration<br /> </span><span style="color: #007700">public function </span><span style="color: #0000BB">displayVar</span><span style="color: #007700">() {<br /> echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-></span><span style="color: #0000BB">var</span><span style="color: #007700">;<br /> }<br />}<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> <p class="para"> The pseudo-variable <var class="varname"><var class="varname">$this</var></var> is available when a method is called from within an object context. <var class="varname"><var class="varname">$this</var></var> is a reference to the calling object (usually the object to which the method belongs, but possibly another object, if the method is called <a href="language.oop5.static.html" class="link">statically</a> from the context of a secondary object). </p> <p class="para"> <div class="example" id="language.oop5.basic.class.this"> <p><strong>Example #2 Some examples of the <var class="varname"><var class="varname">$this</var></var> pseudo-variable</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br /> function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br /> {<br /> if (isset(</span><span style="color: #0000BB">$this</span><span style="color: #007700">)) {<br /> echo </span><span style="color: #DD0000">'$this is defined ('</span><span style="color: #007700">;<br /> echo </span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">);<br /> echo </span><span style="color: #DD0000">")\n"</span><span style="color: #007700">;<br /> } else {<br /> echo </span><span style="color: #DD0000">"\$this is not defined.\n"</span><span style="color: #007700">;<br /> }<br /> }<br />}<br /><br />class </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br /> function </span><span style="color: #0000BB">bar</span><span style="color: #007700">()<br /> {<br /> </span><span style="color: #FF8000">// Note: the next line will issue a warning if E_STRICT is enabled.<br /> </span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /> }<br />}<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">A</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-></span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// Note: the next line will issue a warning if E_STRICT is enabled.<br /></span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= new </span><span style="color: #0000BB">B</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">-></span><span style="color: #0000BB">bar</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// Note: the next line will issue a warning if E_STRICT is enabled.<br /></span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">bar</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> $this is defined (A) $this is not defined. $this is defined (B) $this is not defined. </pre></div> </div> </div> </p> </div> <div class="sect2" id="language.oop5.basic.new"> <h3 class="title">new</h3> <p class="para"> To create an instance of a class, the <em>new</em> keyword must be used. An object will always be created unless the object has a <a href="language.oop5.decon.html" class="link">constructor</a> defined that throws an <a href="language.exceptions.html" class="link">exception</a> on error. Classes should be defined before instantiation (and in some cases this is a requirement). </p> <p class="para"> If a <span class="type"><a href="language.types.string.html" class="type string">string</a></span> containing the name of a class is used with <em>new</em>, a new instance of that class will be created. If the class is in a namespace, its fully qualified name must be used when doing this. </p> <div class="example" id="example-171"> <p><strong>Example #3 Creating an instance</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br />$instance </span><span style="color: #007700">= new </span><span style="color: #0000BB">SimpleClass</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// This can also be done with a variable:<br /></span><span style="color: #0000BB">$className </span><span style="color: #007700">= </span><span style="color: #DD0000">'Foo'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$instance </span><span style="color: #007700">= new </span><span style="color: #0000BB">$className</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Foo()<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> <p class="para"> In the class context, it is possible to create a new object by <em>new self</em> and <em>new parent</em>. </p> <p class="para"> When assigning an already created instance of a class to a new variable, the new variable will access the same instance as the object that was assigned. This behaviour is the same when passing instances to a function. A copy of an already created object can be made by <a href="language.oop5.cloning.html" class="link">cloning</a> it. </p> <div class="example" id="example-172"> <p><strong>Example #4 Object Assignment</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /><br />$instance </span><span style="color: #007700">= new </span><span style="color: #0000BB">SimpleClass</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$assigned </span><span style="color: #007700">= </span><span style="color: #0000BB">$instance</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$reference </span><span style="color: #007700">=& </span><span style="color: #0000BB">$instance</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$instance</span><span style="color: #007700">-></span><span style="color: #0000BB">var </span><span style="color: #007700">= </span><span style="color: #DD0000">'$assigned will have this value'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$instance </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">; </span><span style="color: #FF8000">// $instance and $reference become null<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$instance</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$reference</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$assigned</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> NULL NULL object(SimpleClass)#1 (1) { ["var"]=> string(30) "$assigned will have this value" } </pre></div> </div> </div> <p class="para"> PHP 5.3.0 introduced a couple of new ways to create instances of an object: </p> <div class="example" id="example-173"> <p><strong>Example #5 Creating new objects</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Test<br /></span><span style="color: #007700">{<br /> static public function </span><span style="color: #0000BB">getNew</span><span style="color: #007700">()<br /> {<br /> return new static;<br /> }<br />}<br /><br />class </span><span style="color: #0000BB">Child </span><span style="color: #007700">extends </span><span style="color: #0000BB">Test<br /></span><span style="color: #007700">{}<br /><br /></span><span style="color: #0000BB">$obj1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$obj2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">$obj1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj1 </span><span style="color: #007700">!== </span><span style="color: #0000BB">$obj2</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$obj3 </span><span style="color: #007700">= </span><span style="color: #0000BB">Test</span><span style="color: #007700">::</span><span style="color: #0000BB">getNew</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj3 </span><span style="color: #007700">instanceof </span><span style="color: #0000BB">Test</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$obj4 </span><span style="color: #007700">= </span><span style="color: #0000BB">Child</span><span style="color: #007700">::</span><span style="color: #0000BB">getNew</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj4 </span><span style="color: #007700">instanceof </span><span style="color: #0000BB">Child</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> bool(true) bool(true) bool(true) </pre></div> </div> </div> </div> <div class="sect2" id="language.oop5.basic.extends"> <h3 class="title">extends</h3> <p class="para"> A class can inherit the methods and properties of another class by using the keyword <em>extends</em> in the class declaration. It is not possible to extend multiple classes; a class can only inherit from one base class. </p> <p class="para"> The inherited methods and properties can be overridden by redeclaring them with the same name defined in the parent class. However, if the parent class has defined a method as <a href="language.oop5.final.html" class="link">final</a>, that method may not be overridden. It is possible to access the overridden methods or static properties by referencing them with <a href="language.oop5.paamayim-nekudotayim.html" class="link">parent::</a>. </p> <p class="para"> When overriding methods, the parameter signature should remain the same or PHP will generate an <strong><code>E_STRICT</code></strong> level error. This does not apply to the constructor, which allows overriding with different parameters. </p> <div class="example" id="example-174"> <p><strong>Example #6 Simple Class Inheritance</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">ExtendClass </span><span style="color: #007700">extends </span><span style="color: #0000BB">SimpleClass<br /></span><span style="color: #007700">{<br /> </span><span style="color: #FF8000">// Redefine the parent method<br /> </span><span style="color: #007700">function </span><span style="color: #0000BB">displayVar</span><span style="color: #007700">()<br /> {<br /> echo </span><span style="color: #DD0000">"Extending class\n"</span><span style="color: #007700">;<br /> </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">displayVar</span><span style="color: #007700">();<br /> }<br />}<br /><br /></span><span style="color: #0000BB">$extended </span><span style="color: #007700">= new </span><span style="color: #0000BB">ExtendClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$extended</span><span style="color: #007700">-></span><span style="color: #0000BB">displayVar</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> Extending class a default value </pre></div> </div> </div> </div> <div class="sect2" id="language.oop5.basic.class.class"> <h3 class="title">::class</h3> <p class="para"> Since PHP 5.5, the <em>class</em> keyword is also used for class name resolution. You can get a string containing the fully qualified name of the <em>ClassName</em> class by using <em>ClassName::class</em>. This is particularly useful with <a href="language.namespaces.html" class="link">namespaced</a> classes. </p> <p class="para"> <div class="example" id="language.oop5.basic.class.class.name"> <p><strong>Example #7 Class name resolution</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">NS </span><span style="color: #007700">{<br /> class </span><span style="color: #0000BB">ClassName </span><span style="color: #007700">{<br /> }<br /> <br /> echo </span><span style="color: #0000BB">ClassName</span><span style="color: #007700">::class;<br />}<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="cdata"><pre> NS\ClassName </pre></div> </div> </div> </p> </div> </div><hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="oop5.intro.html">Introduction</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.oop5.properties.html">Properties</a></div> <div class="up"><a href="language.oop5.html">Classes and Objects</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>