PHP在使用常量实例化不同对象时应注意

PHP在使用常量实例化不同对象时应注意,php,constants,Php,Constants,我知道你不能复制常数。我只是不明白为什么它不适用于不同的对象 在我的一个项目中,我使用它们将设置传递给我的对象 以下是一个例子: class someClass { function __construct($config) { define("PRIVATE_KEY", $config['private_key']); } } 下面是我如何创建对象的 $objectA = new someClass($config['A']); $objectB = new

我知道你不能复制常数。我只是不明白为什么它不适用于不同的对象

在我的一个项目中,我使用它们将设置传递给我的对象

以下是一个例子:

class someClass {

    function __construct($config) {
        define("PRIVATE_KEY", $config['private_key']);
    }
}
下面是我如何创建对象的

$objectA = new someClass($config['A']);
$objectB = new someClass($config['B']); //ERROR!!
我得到一个错误:

已定义常量私钥

大多数出现此错误的人多次包含相同的常量

在我的例子中,它们被用于不同的对象。我将添加一些检查,以确保它们没有被重新定义。但我仍然很想知道为什么会发生这种情况


不再使用时对象不是被释放/销毁了吗?

是的,对象在某个时候会被销毁,但是
define
声明是全局的,并且会一直保存到未定义为止。您的代码正在两次定义相同的常量

私有属性、静态属性或其他属性可能更适合您尝试执行的操作,因为它们封装在对象中

class someClass {

    private $private_key;

    // constructor
    function __construct($config) {
        $this->private_key = $config['private_key'];
    }
}

是的,对象在某个时候会被销毁,但是
define
声明是全局的,并且会一直保存到它们未定义为止。您的代码正在两次定义相同的常量

私有属性、静态属性或其他属性可能更适合您尝试执行的操作,因为它们封装在对象中

class someClass {

    private $private_key;

    // constructor
    function __construct($config) {
        $this->private_key = $config['private_key'];
    }
}

您使用私钥的目的是什么?它应该是一个实例变量吗?如果是这样,就不应该使用define(),因为它的作用域是全局的。您可以改为执行
$this->private\u key=$config['private\u key']

您使用private\u key做什么?它应该是一个实例变量吗?如果是这样,就不应该使用define(),因为它的作用域是全局的。您可以改为执行
$this->private_key=$config['private_key']

实例化时对象不应修改全局空间-封装(即事物之间的隔离)是OO编程的关键原则。实例化时对象不应修改全局空间-封装(即事物之间的隔离)是OO编程的一个关键原则。我认为如果将它传递到构造函数中,您不会希望它是静态的——这会使所有对象都是相同的,因此会破坏以这种方式传递它的目的。鉴于OP正在向构造函数传递某些内容,我希望在这里使用实例属性。谢谢。在这个基础上,我也会降低房产价格+哈哈,是的,我也这么想。编辑!感谢各位,你们让我意识到我误用了它,你们不需要像链接的文档那样添加常量吗
const CONSTANT='CONSTANT value'
,什么时候对常量使用define()有用?如果想将值传递给构造函数,就不能使用类常量。声明时必须设置常量值。我自己几乎从未使用过define(),但如果我使用的框架没有其他方法,我可以在配置文件中使用define()。我不认为如果将它传递到构造函数中,您会希望它是静态的-这将使所有对象都是一样的,从而无法达到这样传递它的目的。鉴于OP正在向构造函数传递某些内容,我希望在这里使用实例属性。谢谢。在这个基础上,我也会降低房产价格+哈哈,是的,我也这么想。编辑!感谢各位,你们让我意识到我误用了它,你们不需要像链接的文档那样添加常量吗
const CONSTANT='CONSTANT value'
,什么时候对常量使用define()有用?如果想将值传递给构造函数,就不能使用类常量。声明时必须设置常量值。我自己几乎从未使用过define(),但如果我使用的框架没有其他方法,我可以在配置文件中看到使用define()。private_key只是一个示例,但您有一个有效点+1 private_key只是一个示例,但您有一个有效点+1