首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP外观模式

PHP外观模式
EN

Stack Overflow用户
提问于 2012-02-21 05:27:57
回答 2查看 663关注 0票数 0

我试图学习Facade模式,但遇到了一个问题。PHP不能从PrintPrice方法输出$totalprice。另外,还有其他信息:初始化后的var_dump和object提供给我的:

代码语言:javascript
复制
private 'SkiRent' => 
object(SkiRent)[2]
private 'SkiResortTicketSystem' => 
object(SkiResortTicketSystem)[3]
private 'HotelBookingSystem' => 
object(HotelBookingSystem)[4]
private 'totalprice' => null

但是在调用HaveGoodRest之后,var_dump给了我一个空白页面。我想知道你是否可以帮助我,这是代码:

代码语言:javascript
复制
<?php
class SkiRent
{
public function RentBoots($feetSize, $skierLevel)
{
    return 20*$skierLevel*100/$feetSize;
}
public function RentSki($weight, $skierLevel)
{
    return 40*$skierLevel*100/$weight;
}
public function RentPole($height)
{
    return 5*$height/100;
}
};

class SkiResortTicketSystem
{
public function BuyOneDayTicket()
{
    return 115;
}
public function BuyHalfDayTicket()
{
    return 60;
}
};

class HotelBookingSystem
{
public function BookRoom($roomQuality)
{
    switch ($roomQuality)
    {
        case 3:
            return 250;
        case 4:
            return 500;
        case 5:
            return 900;
        default:
            throw new ArgumentException("roomQuality should be in [3;5]");       
    }

    }
};

class SkiResortFacade
{
private $SkiRent;
private $SkiResortTicketSystem;
private $HotelBookingSystem;
private $totalprice;

function __construct()
{
  $this->SkiRent = new SkiRent(); 
  $this->SkiResortTicketSystem = new SkiResortTicketSystem();
  $this->HotelBookingSystem  = new HotelBookingSystem();
}

function HaveGoodRest($height, $weight, $feetSize, $skierLevel, $roomQuality)
{
    $skiPrice = $SkiRent->RentSki($weight, $skierLevel);
    var_dump($skiPrice);
    $skiBootsPrice = $SkiRent->RentBoots($feetSize,$skierLevel);
    $polePrice = $SkiRent->RentPole($height);
    $oneDayTicketPr = $SkiResortTicketSystem->BuyOneDayTicket();
    $hotelPrice = $HotelBookingSystem->BookRoom($roomQuality);

    $this->totalprice = $skiPrice + $skiBootsPrice + $polePrice + $oneDayTicketPr + $hotelPrice;
}

public function HaveRestWithOwnSkis($roomQuality)
{
    $oneDayTicketPr = $SkiResortTicketSystem->BuyOneDayTicket();
    $hotelPrice = $HotelBookingSystem->BookRoom($roomQuality);
    return $oneDayTicketPr + $hotelPrice;
}

public function PrintPrice()
{
    echo $this->totalprice;
}

};

$rest = new SkiResortFacade();
var_dump($rest);
$height = 181.5;
$weight = 70.1;
$feetSize = 45.2;
$skierLevel = 1.2;
$roomQuality = 3;
$rest->HaveGoodRest($height, $weight, $feetSize, $skierLevel, $roomQuality);
var_dump($rest);
$rest->PrintPrice();
?>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-21 06:46:10

您已经在SkiResortFacade类中定义了$this->SkiRent属性:

代码语言:javascript
复制
$this->SkiRent = new SkiRent(); 

但是您已经在没有$this的情况下引用它:

代码语言:javascript
复制
$skiPrice = $SkiRent->RentSki($weight, $skierLevel);  

它应该是:

代码语言:javascript
复制
$skiPrice = $this->SkiRent->RentSki($weight, $skierLevel);

这是一个正常工作的代码,因此您可以与您的版本进行比较:

代码语言:javascript
复制
<?php
class SkiRent
{
public function RentBoots($feetSize, $skierLevel)
{
    return 20*$skierLevel*100/$feetSize;
}
public function RentSki($weight, $skierLevel)
{
    return 40*$skierLevel*100/$weight;
}
public function RentPole($height)
{
    return 5*$height/100;
}
};

class SkiResortTicketSystem
{
public function BuyOneDayTicket()
{
    return 115;
}
public function BuyHalfDayTicket()
{
    return 60;
}
};

class HotelBookingSystem
{
public function BookRoom($roomQuality)
{
    switch ($roomQuality)
    {
        case 3:
            return 250;
        case 4:
            return 500;
        case 5:
            return 900;
        default:
            throw new ArgumentException("roomQuality should be in [3;5]");       
    }

    }
};

class SkiResortFacade
{
private $SkiRent;
private $SkiResortTicketSystem;
private $HotelBookingSystem;
private $totalprice;

function __construct()
{
  $this->SkiRent = new SkiRent(); 
  $this->SkiResortTicketSystem = new SkiResortTicketSystem();
  $this->HotelBookingSystem  = new HotelBookingSystem();
}

function HaveGoodRest($height, $weight, $feetSize, $skierLevel, $roomQuality)
{
    $skiPrice = $this->SkiRent->RentSki($weight, $skierLevel);
    var_dump($skiPrice);
    $skiBootsPrice = $this->SkiRent->RentBoots($feetSize,$skierLevel);
    $polePrice = $this->SkiRent->RentPole($height);
    $oneDayTicketPr = $this->SkiResortTicketSystem->BuyOneDayTicket();
    $hotelPrice = $this->HotelBookingSystem->BookRoom($roomQuality);

    $this->totalprice = $skiPrice + $skiBootsPrice + $polePrice + $oneDayTicketPr + $hotelPrice;
}

public function HaveRestWithOwnSkis($roomQuality)
{
    $oneDayTicketPr = $SkiResortTicketSystem->BuyOneDayTicket();
    $hotelPrice = $HotelBookingSystem->BookRoom($roomQuality);
    return $oneDayTicketPr + $hotelPrice;
}

public function PrintPrice()
{
    echo $this->totalprice;
}

};

$rest = new SkiResortFacade();
$height = 181.5;
$weight = 70.1;
$feetSize = 45.2;
$skierLevel = 1.2;
$roomQuality = 3;
$rest->HaveGoodRest($height, $weight, $feetSize, $skierLevel, $roomQuality);
$rest->PrintPrice();
票数 0
EN

Stack Overflow用户

发布于 2012-02-21 05:38:58

致命错误:在第65行对非对象调用成员函数RentSki()

代码语言:javascript
复制
$skiPrice = $SkiRent->RentSki($weight, $skierLevel); // Line 65

$SkiRent不是对象,因为您尚未在HaveGoodRest()方法中实例化它或将其作为参数传入

您的代码中有多个对被操作的非对象的调用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9368667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档