【问题标题】:Setting a class variable to string in php?在php中将类变量设置为字符串?
【发布时间】:2025-12-16 06:25:01
【问题描述】:

我已尝试在网上搜索此问题,但找不到解决问题的方法。

我正在实现一个购物车,它将向 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;
    }
....

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

class PayEx
{
    public $price = $mainPrice;
}

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

【问题讨论】:

  • $mainPrice 在哪里定义?为什么不在类中创建一个函数,它将 $price 设置为您想要的值?

标签: php string class variables public


【解决方案1】:

TL;TR

在这段代码之前,我有一个设置$mainPrice值的SQL查询

好的,您想将其值分配给$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。

【讨论】:

  • @Machavity:谢谢链接,希望你不介意我把它添加到我的答案中
【解决方案2】:

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

在你的 SQL 之后,当你调用你的类时,你可以定义价格。

// Your sql...

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

【讨论】:

  • 虽然这都是真的,但最好使用函数在类内设置值,而不是直接在类外设置。
  • @Machavity :当然,这只是他设置它的更快更简单的方法。
  • 不能推荐这个,如果没有设置$mainPrice,该类甚至不能工作,这种方法允许在没有设置要求的情况下使用该类-最好使用constructor功能
  • @djidi:当然,它可能更短,但它会使您的代码不太可靠:setter 可以验证数据,分配任何旧变量可能会导致意外行为(或错误)进一步出现.因此,这种代码更难调试
【解决方案3】:

如果您想在 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);

【讨论】:

    【解决方案4】:

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

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

    你会这样称呼:

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

    【讨论】: