Solved

# how does local variables know costtype=2 instantly

Posted on 2014-04-30
184 Views
``````<?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
Question by:rgb192
• 2
• 2
• 2

LVL 17

Expert Comment

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

LVL 30

Expert Comment

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 Comment

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

LVL 30

Assisted Solution

Marco Gasi earned 250 total points
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

LVL 17

Accepted Solution

jrm213jrm213 earned 250 total points
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 Closing Comment

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

## Featured Post

### Suggested Solutions

Password hashing is better than message digests or encryption, and you should be using it instead of message digests or encryption.  Find out why and how in this article, which supplements the original article on PHP Client Registration, Login, Logo…
This article discusses four methods for overlaying images in a container on a web page
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…