Solved

how does local variables know costtype=2 instantly

Posted on 2014-04-30
6
184 Views
Last Modified: 2014-04-30
<?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
0
Comment
Question by:rgb192
  • 2
  • 2
  • 2
6 Comments
 
LVL 17

Expert Comment

by:jrm213jrm213
Comment Utility
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

by:Marco Gasi
Comment Utility
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
 

Author Comment

by:rgb192
Comment Utility
How are constants known outside class?
And how can seminar be called with
Only 1 parameter
0
Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 30

Assisted Solution

by:Marco Gasi
Marco Gasi earned 250 total points
Comment Utility
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

by:
jrm213jrm213 earned 250 total points
Comment Utility
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
 

Author Closing Comment

by:rgb192
Comment Utility
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

Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

Join & Write a Comment

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…

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now