how does local variables know costtype=2 instantly

<?php
abstract class Lesson {
    protected $duration;
    const     FIXED = 1;
    const     TIMED = 2;
    private   $costtype;

    function __construct( $duration, $costtype=1 ) {
        $this->duration = $duration;
        $this->costtype = $costtype;
    }

    function cost() {
        switch ( $this->costtype ) {
            CASE self::TIMED :
                return (5 * $this->duration);
                break;
            CASE self::FIXED :
                return 30;
                break;
            default:
                $this->costtype = self::FIXED;
                return 30;
        }
    }

    function chargeType() {
        switch ( $this->costtype ) {
            CASE self::TIMED :
                return "hourly rate";
                break;
            CASE self::FIXED :
                return "fixed rate";
                break;
            default:
                $this->costtype = self::FIXED;
                return "fixed rate";
        }
    }

    // more lesson methods...
}

class Lecture extends Lesson {
    // Lecture-specific implementations ...
}

class Seminar extends Lesson {
    // Seminar-specific implementations ...
}

$lecture = new Lecture( 51, Lesson::FIXED );
print "{$lecture->cost()} ({$lecture->chargeType()})\n"; 

$seminar= new Seminar( 4, Lesson::TIMED );
print "{$seminar->cost()} ({$seminar->chargeType()})\n"; 
?>

Open in new window


look at the call stack
line55
$seminar= new Seminar( 4, Lesson::TIMED );
enters constructor line8
    function __construct( $duration, $costtype=1 ) {
and the local variables know that $costtype is 2 before any if statement

I could understand
if parameter2:
costtype=2,
then
set costtype=2


how does local variables know costtype=2 instantly
LVL 1
rgb192Asked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
jrm213jrm213Connect With a Mentor Commented:
Hi,
How are constants known outside class?
The constants are within the class

abstract class Lesson {
    protected $duration;
    const     FIXED = 1;
    const     TIMED = 2;
    private   $costtype;

Open in new window



FIXED and TIMED are constant variables of the Lesson class.

And how can seminar be called with Only 1 parameter

When you create an instance of the class Seminar, it should run the parent constructor since it doesn't have one of it's own. Yhe constructor of the Lesson class takes 1 required parameter $duration and 1 optional parameter $costtype. So if you only supply 1 parameter when you create an instance of the Seminar class

$seminar= new Seminar(4);

the required parameter $duration will receive that value (4) and the optional parameter $costtype will be set to it's default value, which is 1.

see on php.net: http://www.php.net/manual/en/functions.arguments.php#functions.arguments.default
0
 
jrm213jrm213Commented:
Hi,

The local variables know because it was passed in as a parameter. In the Constructor

 function __construct( $duration, $costtype=1 )

$duration is a required parameter.
$costtype is an optional parameter,if you don't send a value for the parameter it will be set to 1.

So
$seminar= new Seminar( 4, Lesson::TIMED );
sets the second parameter, $costtype to 2

$seminar= new Seminar( 4, Lesson::FIXED);
sets the $costtype to 1 however, you could just call
$seminar= new Seminar( 4);
and get the same result...
0
 
Marco GasiFreelancerCommented:
No points for this: it's only to clarify what jrm213jrm213 correctly said.

Lesson::TIMED sets the second parameter to 2 because TIMED is a constant you define at the beginning of your class setting its value to 2

abstract class Lesson {
    protected $duration;
    const     FIXED = 1;
    const     TIMED = 2;

Open in new window

0
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

 
rgb192Author Commented:
How are constants known outside class?
And how can seminar be called with
Only 1 parameter
0
 
Marco GasiConnect With a Mentor FreelancerCommented:
Yyou call them as parameter of a descendant class of Lesson, that is  Seminar: being Seminar a descendant of Lesson, it knows everything which is not private of the ancestor class.
0
 
rgb192Author Commented:
thanks


FIXED and TIMED are constant variables of the Lesson class.
1 required parameter $duration and 1 optional parameter

 parameter of a descendant class of Lesson, that is  Seminar: being Seminar a descendant of Lesson, it knows everything which is not private of the ancestor class.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.