The $this Attribute
The HelloWorld class actually does something, which is nice, but it’s a fairly minimal example. The class includes a method, but it does not contain any attributes (variables).
As I say in the section “Defining a Class,” attributes:
- Are variables
- Must be declared as public, private, or protected (I’ll use only public in this chapter)
- If initialized, must be given a static value (not the result of an expression)
Those are the rules for defining a class’s attributes, but using those attributes requires one more piece of information. As already explained, through the object, you can access attributes via the object notation operator (->):
$object->propertyName;
The issue is that within the class itself (i.e., within a class’s methods), you must use an alternative syntax to access the class’s attributes. You cannot do just this:
class BadClass { public $var; function do() { // This won't work: print $var; } }
The do() method cannot access $var in that manner. The solution is a special variable called $this. The $this variable in a class always refers to the current instance (i.e., the object involved) of that class. Within a method, you can refer to the instance of a class and its attributes by using the $this->attributeName syntax.
Rather than over-explaining this concept, I’ll go right into another example that puts this new knowledge into action. This next, much more practical, example will define a class representing a rectangle.
To use the $this variable:
Create a new PHP document in your text editor or IDE, to be named Rectangle.php (Script 4.3):
<?php # Script 4.3 - Rectangle.php
Begin defining the class:
class Rectangle {
Declare the attributes:
public $width = 0; public $height = 0;
This class has two attributes: one for the rectangle’s width and another for its height. Both are initialized to 0.
Create a method for setting the rectangle’s dimensions:
function setSize($w = 0, $h = 0) { $this->width = $w; $this->height = $h; }
The setSize() method takes two arguments, corresponding to the width and height. Both have default values of 0, just to be safe.
Within the method, the class’s attributes are given values using the numbers to be provided when this method is called (assigned to $w and $h). Using $this->width and $this->height refers to this class’s $width and $height attributes.
Script 4.3. This class is much more practical than the HelloWorld example. It contains two attributes—for storing the rectangle’s width and height—and four methods.
1 <?php # Script 4.3 - Rectangle.php 2 /* This page defines the Rectangle class. 3 * The class contains two attributes: width and height. 4 * The class contains four methods: 5 * - setSize() 6 * - getArea() 7 * - getPerimeter() 8 * - isSquare() 9 */ 10 11 class Rectangle { 12 13 // Declare the attributes: 14 public $width = 0; 15 public $height = 0; 16 17 // Method to set the dimensions: 18 function setSize($w = 0, $h = 0) { 19 $this->width = $w; 20 $this->height = $h; 21 } 22 23 // Method to calculate and return the area. 24 function getArea() { 25 return ($this->width * $this->height); 26 } 27 28 // Method to calculate and return the perimeter. 29 function getPerimeter() { 30 return ( ($this->width + $this->height) * 2 ); 31 } 32 33 // Method to determine if the rectange 34 // is also a square. 35 function isSquare() { 36 if ($this->width == $this->height) { 37 return true; // Square 38 } else { 39 return false; // Not a square 40 } 41 } 42 43 } // End of Rectangle class.
Create a method that calculates and returns the rectangle’s area:
function getArea() { return ($this->width * $this->height); }
This method doesn’t need to take any arguments, because it can access the class’s attributes via $this. Calculating the area of a rectangle is simple: multiply the width times the height. This value is then returned.
Create a method that calculates and returns the rectangle’s perimeter:
function getPerimeter() { return ( ($this->width + $this->height) * 2 ); }
This method is like getArea(), except it uses a different formula.
Create a method that indicates if the rectangle is also a square:
function isSquare() { if ($this->width == $this->height) { return true; } else { return false; } }
This method compares the rectangle’s dimensions. If they are the same, the Boolean true is returned, indicating the rectangle is a square. Otherwise, false is returned.
Complete the class:
} // End of Rectangle class.
- Save the file as Rectangle.php.
To use the Rectangle class:
Create a new PHP document in your text editor or IDE, to be named rectangle1.php, beginning with the standard HTML (Script 4.4):
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Rectangle</title> <link rel="stylesheet" href="style.css"> </head> <body> <?php # Script 4.4 - rectangle1.php
Include the class definition:
require('Rectangle.php');
Define the necessary variables and print an introduction:
$width = 42; $height = 7; echo "<h2>With a width of $width and a height of $height...</h2>";
Create the object and assign the rectangle’s dimensions:
$r = new Rectangle(); $r->setSize($width, $height);
The first line creates an object of type Rectangle. The second line assigns the values of the variables in this script—$width and $height—to the object’s attributes. The values here are assigned to $w and $h in the setSize() method when it’s called, which are then assigned to $this->width and $this->height within that method.
Print the rectangle’s area:
echo '<p>The area of the rectangle is ' . $r->getArea() . '</p>';
To print the rectangle’s area, you only need to have the object tell you what that value is by calling its getArea() method. As this method returns the area (instead of printing it), it can be used in an echo statement like this.
Print the rectangle’s perimeter:
echo '<p>The perimeter of the rectangle is ' . $r->getPerimeter() . '</p>';
This is a variation on the code in Step 5.
Indicate whether or not this rectangle is also a square:
echo '<p>This rectangle is '; if ($r->isSquare()) { echo 'also'; } else { echo 'not'; } echo ' a square.</p>';
Since the isSquare() method returns a Boolean value, I can invoke it as a condition. This code will print either This rectangle is also a square. or This rectangle is not a square.
Delete the object and complete the page:
unset($r); ?> </body> </html>
- Save the file as rectangle1.php and place it in your Web directory, along with Rectangle.php.
Script 4.4. The Rectangle class is used in this PHP script. The rectangle’s dimensions are first assigned to the class’s attributes by invoking the setSize() method, and then various properties of the rectangle are reported.
1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="utf-8"> 5 <title>Rectangle</title> 6 <link rel="stylesheet" href="style.css"> 7 </head> 8 <body> 9 <?php # Script 4.4 - rectangle1.php 10 /* This page uses the Rectangle class. 11 * This page shows a bunch of information about a rectangle. 12 */ 13 14 // Include the class definition: 15 require('Rectangle.php'); 16 17 // Define the necessary variables: 18 $width = 42; 19 $height = 7; 20 21 // Print a little introduction: 22 echo "<h2>With a width of $width and a height of $height...</h2>"; 23 24 // Create a new object: 25 $r = new Rectangle(); 26 27 // Assign the rectangle dimensions: 28 $r->setSize($width, $height); 29 30 // Print the area: 31 echo '<p>The area of the rectangle is ' . $r->getArea() . '</p>'; 32 33 // Print the perimeter: 34 echo '<p>The perimeter of the rectangle is ' . $r->getPerimeter() . '</p>'; 35 36 // Is this a square? 37 echo '<p>This rectangle is '; 38 if ($r->isSquare()) { 39 echo 'also'; 40 } else { 41 echo 'not'; 42 } 43 echo ' a square.</p>'; 44 45 // Delete the object: 46 unset($r); 47 48 ?> 49 </body> 50 </html>
Test rectangle1.php by viewing it in your Web browser .
- Change the variables’ values in rectangle1.php and rerun it in your Web browser .