在php中将类变量设置为字符串?

时间:2014-07-30 14:40:22

标签: php string class variables public

我曾尝试在网上搜索此内容,但无法找到解决问题的方法。

我正在实施一个购物车,它会将一些变量发送到PayEx付款,但我正在努力处理一些Class和Public变量。

代码:

class PayEx
{
    public $price = '00';
    //$respons is xml
    private $respons;
    private $orderRef;

    function initialization()
    {       
        $this->clientIPAddress = $_SERVER['REMOTE_ADDR'];       
        $this->clientIdentifier = "USERAGENT=".$_SERVER['HTTP_USER_AGENT'];
        $params = array
        (
            'price' => $this->price
        );

        return $params;
    }
....

在此代码之前,我有一个SQL查询设置$mainPrice的值,所以我想做的是这样的:

class PayEx
{
    public $price = $mainPrice;
}

但这不起作用,我做错了什么?

4 个答案:

答案 0 :(得分:4)

TL; TR

  

在此代码之前,我有一个SQL查询,用于设置$mainPrice

的值

好的,您想将其值分配给$price属性。在这种情况下:编写一个以$mainPrice作为参数的构造函数,并将其分配给$price属性。
详情如下所述


这非常简单:$mainPrice(可能)是一个全局变量(is evil,但这不是重点)。 PayEx类有自己的范围。它的属性将使用构造函数中的常量值进行初始化(使用传递给它的参数)。

一个类是一个可移植的单个代码单元。因此依赖于自身之外的任何变量,只是为了做生意。谁会说这个$mainPrice变量会在每次使用/初始化类时出现?更重要的是:何时会评估private $price = $mainPrice;语句?包含类定义的文件是require' d?当自动加载器启动时?创建第一个实例时,还是创建实例时?想一想......你知道它在OO环境中

适当的做法是:

class PayEx
{
    private $price = null;
    /**
     * Constructors - They are there to initialize properties
     * @param $mainPrice = null - null makes it optional
     */
    public function __construct($mainPrice = null)
    {
        $this->price = $mainPrice
    }
}
$x = new PayEx(123);//price propery is 123
$y = new PayEx();//price property is null

最安全设置属性的方法是,并且将始终是:创建自定义getter / setter方法。例如,这些方法可以对您尝试分配给属性的值执行额外检查。如果提供了无效数据,它们也可以抛出异常,包含有关错误的特定信息,使代码更易于使用,维护和调试:

class PayEx
{
    private $price = null;
    public function __construct($mainPrice = null)
    {
        if ($mainPrice !== null)
            $this->setPrice($mainPrice);
    }
    /**
     * Custom setter
     * @param float $price
     * @return $this
     * @throws \InvalidArgumentException
     */
    public function setPrice($price)
    {
        if (!is_numeric($price))
            throw new \InvalidArgumentException(
                sprintf(
                    '%s expected argument of type float, instead saw non-numeric %s',
                    __METHOD__,
                    gettype($price)
                )
            );
        $this->price = (float) $price;
        return $this;
    }
    /**
     * custom getter
     * @param null|string $format
     * @return float|string
     */
    public function getPrice($format = null)
    {
        if ($format === null)
            return $this->price;
        return sprintf($format, $this->price);
    }
}
$x = new PayEx(12.456);
echo $x->getPrice('%.2f');//echoes 12.45
var_dump($x->getPrice());//float 12.456

我希望这能让您了解为什么在较大的项目中经常使用getter和setter。

答案 1 :(得分:1)

您不能直接在类变量上使用var。

在您的SQL之后,当您打电话给您的课程时,您可以定义价格。

// Your sql...

$payex = new PayEx();
$payex->price = $mainPrice;

答案 2 :(得分:0)

如果你想在class开始工作之前设置变量,可以在创建对象的新实例时调用的类中使用__construct函数。

class PayEx
{
    public $price = 0;

    public function __construct($price)
    {
        $this->price = $price
    }
}

您可以传递价格变量,现在可以从PayEx

创建对象
$payExObject = new PayEx($mainPrice);

替代方案,您可以使用Getter和Setter函数

class PayEx
{
    public $price = 0;

    public function getPrice()
    {
        return $this->price;
    }

    public function setPrice($price)
    {
        $this->price = $price;
        return $this;
    }
}

并传递像这样的变量

$payExObject = new PayEx();
$payExObject->setPrice($mainPrice);

答案 3 :(得分:0)

除了@djidi建议的内容外,您还可以使用构造函数:

class PayEx
{
    public function __construct($price = '00') {
        $this->price = $price;
    }
....

您可以这样称呼:

....
$payex = new PayEx($mainPrice);
....