• Status: Solved
• Priority: Medium
• Security: Public
• Views: 204

# 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";
?>
``````

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

0
rgb192
• 2
• 2
• 2
2 Solutions

Commented:
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

FreelancerCommented:
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;
``````
0

Author Commented:
How are constants known outside class?
And how can seminar be called with
Only 1 parameter
0

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

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;
``````

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

Author 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.

## Featured Post

• 2
• 2
• 2
Tackle projects and never again get stuck behind a technical roadblock.