Description & Purpose
In this post I discuss how I troubleshot a simple object-oriented (OOP) PHP program that had array and class issues.
Yesterday I began taking a course on LinkedIn Learning callled PHP: Object-Oriented Programming (OOP) because I want to refresh my OOP knowledge and fill in any blanks in my understanding. I got to the end of chapter 2 and was excited to complete the first challenge assignment.
But, I ran into an error:

Here’s a simplified version of the code:
challenge_min.php (orig.)
<?php
class Bicycle {
var $brand;
var $model;
var $year;
var $description;
var $weight_kg;
const CONV_KG2LBS = 2.2046226218;
function name() {
$name = "$brand $model" . "(" . $year . ")";
echo $name;
exit;
return $name;
}
}
/* HELPER FUNCTIONS
_________________________________________________*/
function display_bike($bike) {
$out = "<h3 style='color:blue;'>" . $bike->name() . "</h3>";
echo $out;
}
/* INSTANTIATE SOME OBJECTS
_________________________________________________*/
$bike1 = new Bicycle (/*brand, model, year, description, weight_kg*/);
$bike1->brand = "Scott";
$bike1->model = "Addict CX 20 Disc";
$bike1->year = 2017;
$bike1->description = "Carbon frame cyclocross bike with upper mid-range components and hydraulic disc brakes.";
$bike1->weight_kg = 9.12;
$bike2 = new Bicycle (/*brand, model, year, description, weight_kg*/);
$bike2->brand = "Trek";
$bike2->model = "500";
$bike2->year = 1984;
$bike2->description = "Vintage drop-barred road bike.";
$bike2->weight_kg = 8.90;
$bike3 = new Bicycle (/*brand, model, year, description, weight_kg*/);
$bike3->brand = "Devinci";
$bike3->model = "Spartan X1";
$bike3->year = 2015;
$bike3->description = "Vintage drop-barred road bike.";
$bike3->weight_kg = 13.18;
// Add all bikes to an array for iteration
$bikes[] = [$bike1, $bike2, $bike3];
/* SET & READ PROPERTIES
_________________________________________________*/
echo "<h2>Set & Read Properties</h2>";
foreach ($bikes as $bike) {
// does_method_exist('Bicyle', 'name');
display_bike($bike);
echo "<hr>";
}
?>
Stack Overflow post:
I sought help on StackOverflow and learned from one user that the array being referenced was this one (line 55):
$bikes[] = [$bike1, $bike2, $bike3];
and that the issue was that using bracket notation in the variable name declares an associative (multidimensional) array, as opposed to a single-dimension array (usually just called ‘array’). Apparently the Fatal error was because I was treating an associative array as a linear array.
I also realized that I was building the $name property in the Bicycle class incorrectly. Here is the code in question. Can you see the problem?
$name = "$brand $model" . "(" . $year . ")";
Buildng the $name variable this way is wrong. Inside a class you must use the $this variable to refer to the current instance of the class. Additionally, you must use the arrow notation to reference properties, as in $this->some_property.
Here is what the corrected code snipped looks like:
$name = $this->brand . " " . $this->model . " (" . $this->year . ")";
But, the code still had issues. These issues turned out to have been introduced by my debugging techniques. In a few places I tried adding an echo instead of a return statement and exits as well. Once I determined where returns should be instead of echos, I made those corrections, removed the exit statements, and the program finally worked! Here is the resulting (minified) working program:
challenge_min.php (final)
<?php
class Bicycle {
var $brand;
var $model;
var $year;
var $description;
var $weight_kg;
const CONV_KG2LBS = 2.2046226218;
function name() {
// $name = "{$this->brand} {$this->model} ({$this->year})";
$name = $this->brand . " " . $this->model . " (" . $this->year . ")";
return $name;
}
}
/* HELPER FUNCTIONS
_________________________________________________*/
function display_bike($bike) {
$out = "<h3 style='color:blue;'>";
$out .= $bike->name();
$out .= "</h3>";
return $out;
}
/* INSTANTIATE SOME OBJECTS
_________________________________________________*/
$bike1 = new Bicycle (/*brand, model, year, description, weight_kg*/);
$bike1->brand = "Scott";
$bike1->model = "Addict CX 20 Disc";
$bike1->year = 2017;
$bike1->description = "Carbon frame cyclocross bike with upper mid-range components and hydraulic disc brakes.";
$bike1->weight_kg = 9.12;
$bike2 = new Bicycle (/*brand, model, year, description, weight_kg*/);
$bike2->brand = "Trek";
$bike2->model = "500";
$bike2->year = 1984;
$bike2->description = "Vintage drop-barred road bike.";
$bike2->weight_kg = 8.90;
$bike3 = new Bicycle (/*brand, model, year, description, weight_kg*/);
$bike3->brand = "Devinci";
$bike3->model = "Spartan X1";
$bike3->year = 2015;
$bike3->description = "Vintage drop-barred road bike.";
$bike3->weight_kg = 13.18;
// Add all bikes to an array for iteration
$bikes = [$bike1, $bike2, $bike3];
/* SET & READ PROPERTIES
_________________________________________________*/
// echo "<h2>Set & Read Properties</h2>";
foreach ($bikes as $bike) {
// does_method_exist('Bicyle', 'name');
echo display_bike($bike);
// echo $bike->name();
}
?>
Algorithm:
Here is the algorithm that I came up with:
1) Create 3 Bicycle objects (instances of bicycle class) 2) Add all bicycles to a list array 3) For each bicycle: A. Get the bike name from name() method B. Format the bike name so it looks nice C. Display bike name in browser
Result:
This rudimentary object-oriented PHP program prints 3 bicycle names to screen in blue text.

Conclusion:
Here are the issues that I ran into and fixed during troubleshooting this project:
- Incorrectly using short array notation (bracket notation).
- Failing to use $this and arrow notation to reference properties in building the $name variable.
- Debugging code introduced some errors/
Bonus:
Here is my finished program I wrote based on this code challenge:
challenge_ch02.php
