简体   繁体   中英

Undefined variable notices in PHP class instance call

Using PHP, when I call an instance of a class I am getting an undefined variable notice back. I program in other languages, but am less familiar with PHP, can you please look at my code and inform me as to my mistake in defining my class variables? Thanks.

<?php
    // create class Bike
    class Bike
    {
        // create variables for class Bike of price, max_speed, and miles
        var $price;
        var $max_speed;
        var $miles;

        // create constructor for class Bike with user set price and max_speed
        function __construct($price, $max_speed)
        {
            $this->price = $price;
            $this->max_speed = $max_speed;
        }

        // METHODS for class Bike:
        // displayInfo() - have this method display the bike's price, maximum speed, and the total miles driven
        function displayInfo()
        {
            echo "Price: $" . $price .  "<p>Maximum Speed: " . $max_speed . "</p>" . "<p>Total Miles Driven: " . $miles . "</p>";
        }

        // drive() - have it display "Driving" on the screen and increase the total miles driven by 10
        function drive()
        {
            $miles = $miles + 10;
            echo "<p>Driving!</p>" . "<p>Total Miles Driven: " . $miles . "</p>";
        }

        // reverse() - have it display "Reversing" on the screen and decrease the total miles driven by 5...
        function reverse()
        {
            // What would you do to prevent the instance from having negative miles?
            if($miles >= 5)
            {
                $miles = $miles - 5;
                echo "<p>Reversing</p><p>Total Miles Driven: " . $miles . "</p>";
            }
            else
            {
                echo "<p>Total Miles Driven is less than 5 miles, unable to reverse!</p>";
            }
        }
    }
?>

<?php
    // Create 3 bike object class instances
    $Schwinn = new Bike(50, '10mph');
    $Specialized = new Bike(500, '25mph');
    $Cannondale = new Bike(1000, '50mph');

    // Have the first instance drive three times, reverse one and have it displayInfo().
    var_dump($Schwinn); // shows instance is created with proper variable assignments
    $Schwinn -> drive();
    // $Schwinn -> drive();
    // $Schwinn -> drive();
    $Schwinn -> reverse();
    $Schwinn -> displayInfo();
?>

Errors:

Notice: Undefined variable: miles in /home/heidi/Desktop/CodingDojo/OOP/php_oop_basic1.php on line 27
Notice: Undefined variable: miles in /home/heidi/Desktop/CodingDojo/OOP/php_oop_basic1.php on line 35
Notice: Undefined variable: price in /home/heidi/Desktop/CodingDojo/OOP/php_oop_basic1.php on line 21
Notice: Undefined variable: max_speed in /home/heidi/Desktop/CodingDojo/OOP/php_oop_basic1.php on line 21
Notice: Undefined variable: miles in /home/heidi/Desktop/CodingDojo/OOP/php_oop_basic1.php on line 21

In PHP (and in javascript, python and many others), $this is explicit when referencing class variables:

// local variable
$price
// class variable
$this->price

Also take a look at the manual .

Every instance you try to assign the variables (properties) of an object you need to use $this->var_name . Your code should be updated to read like this:

<?php
    // create class Bike
    class Bike
    {
        // create variables for class Bike of price, max_speed, and miles
        var $price;
        var $max_speed;
        var $miles;

        // create constructor for class Bike with user set price and max_speed
        function __construct($price, $max_speed)
        {
            $this->price = $price;
            $this->max_speed = $max_speed;
        }

        // METHODS for class Bike:
        // displayInfo() - have this method display the bike's price, maximum speed, and the total miles driven
        function displayInfo()
        {
            echo "Price: $" . $this->price .  "<p>Maximum Speed: " . $this->max_speed . "</p>" . "<p>Total Miles Driven: " . $this->miles . "</p>";
        }

        // drive() - have it display "Driving" on the screen and increase the total miles driven by 10
        function drive()
        {
            $this->miles = $this->miles + 10;
            echo "<p>Driving!</p>" . "<p>Total Miles Driven: " . $this->miles . "</p>";
        }

        // reverse() - have it display "Reversing" on the screen and decrease the total miles driven by 5...
        function reverse()
        {
            // What would you do to prevent the instance from having negative miles?
            if($this->miles >= 5)
            {
                $this->miles = $this->miles - 5;
                echo "<p>Reversing</p><p>Total Miles Driven: " . $this->miles . "</p>";
            }
            else
            {
                echo "<p>Total Miles Driven is less than 5 miles, unable to reverse!</p>";
            }
        }
    }
?>

<?php
    // Create 3 bike object class instances
    $Schwinn = new Bike(50, '10mph');
    $Specialized = new Bike(500, '25mph');
    $Cannondale = new Bike(1000, '50mph');

    // Have the first instance drive three times, reverse one and have it displayInfo().
    var_dump($Schwinn); // shows instance is created with proper variable assignments
    $Schwinn -> drive();
    // $Schwinn -> drive();
    // $Schwinn -> drive();
    $Schwinn -> reverse();
    $Schwinn -> displayInfo();
?>


This Outputs:

object(Bike)#1 (3) { ["price"]=> int(50) ["max_speed"]=> string(5) "10mph" ["miles"]=> NULL }

Driving!

Total Miles Driven: 10

Reversing

Total Miles Driven: 5
Price: $50

Maximum Speed: 10mph

Total Miles Driven: 5


Also, look into defining property and method Visibility . Defining properties with var in an object assumes it's set in "public" visibility scope. Examples:

class Bike
{
    var $price; //var was almost depreciated in objects (early PHP 5.0)

    public $price; //Now the commonly accepted method, same behavior as above.

    protected $price; //protected means only this class, parent class or extended class can use this $price

    private $price; //Private means only this class may use this $price property.

    public $price = ''; //You can also define the variable when declaring it.

You can also declare methods (class functions) with the same visibility scopes. Also, you can only get public properties (object variables) outside of the class definition using $class->var_name . Private and protected properties will throw a fatal error as they cannot be accessed directly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM