我有一个名为testclass
的类,其中包含多个函数。他们都需要访问一个预定义变量$need_to_have
。我想在课堂上定义它,但是如何?
示例:
class testclass {
// This won't work:
private static $need_to_have = get_some_info();
public static testfunction1() {
// Do Something with $need_to_have
}
public testfunction2 () {
// Do something else with $need_to_have
}
}
忘记提及:我想让它私有化,我只在静态函数上调用变量,所以我不能使用构造函数。
答案 0 :(得分:2)
您无法做到这一点,因为您无法使用非常量表达式初始化类属性。
class testclass {
private static $need_to_have;
private static $need_to_have_initialized;
public static testfunction1()
{
// Do Something with getNeedToHave()
}
private static function getNeedToHave()
{
if (!self::$need_to_have_initialized) {
self::$need_to_have = get_some_info();
self::$need_to_have_initialized = true;
}
return self::$need_to_have;
}
}
如果有get_some_info
保证永不返回的常量值,您可以使用它来初始化$need_to_have
;这将允许您摆脱辅助属性$need_to_have_initialized
:
// example: get_some_info() never returns false
private static $need_to_have = false;
private static function getNeedToHave()
{
if (self::$need_to_have === false) {
self::$need_to_have = get_some_info();
}
return self::$need_to_have;
}
另一种可能的修改(改进?)是使getNeedToHave
内的属性(以及"初始化"标志,如果适用)局部静态变量;通过这种方式,他们甚至无法从课堂本身的任何地方看到它们:
private static function getNeedToHave()
{
static $need_to_have = false;
if ($need_to_have === false) {
$need_to_have = get_some_info();
}
return $need_to_have;
}
答案 1 :(得分:1)
这几乎有很多方法可以做到。
这里最流行的方法是使用所谓的getter(访问器)方法,该方法将返回有关该属性的当前信息,并且它仍然可以是私有的。
class TestClass {
private static $myVar = 5;
public static getMyVar() {
return self::$myVar;
}
}
因此,通过适当的自动加载器,您可以在所有应用程序中调用
TestClass::getMyVar();
而且,正如你在评论中所说的那样,没有人可以从课堂外改变它。
但是,它可能被认为是不好的做法,不仅仅是静态方式,也不应该引用一个与之无关的类,只能检索信息。
此处最好的方法是实现注册表模式,您可以在其中将信息注册到全局空间。
创建一个实现Registry设计模式的分离类,并且可能设置一些约束,因此一旦设置了myVar
nobody就可以重置它,以便能够使用以下语法
Registry::get('myVar');
当然,这将使您有机会在将该属性注册到globalspace之前在该属性中添加更多逻辑,因为定义属性可能会使您在某些定义方面遇到麻烦。
答案 2 :(得分:0)
使它成为类的属性,设置一次并在任何地方使用它:
class testclass
{
public static $need_to_have;
public function __construct()
{
//$this->need_to_have=1;
// Or rather the value returned by
// whatever it is you are doing with it
$this->need_to_have=$this->setNeed();
}
public function testfunction1()
{
// Do Something with $need_to_have
echo $this->need_to_have
}
public function testfunction2 ()
{
echo $this->need_to_have
}
public function setNeed()
{
$x=4;
$y=6;
$ret=$x*$y;
return $ret;
}
}
答案 3 :(得分:0)
没有(面向对象的)方式“让variable全班级可访问”。但这不是必需的。
您要找的是对象和课程properties或class constants。
class TestClass {
const TEST_CLASS_CONSTANT = 'foo';
private static $testClassProperty;
// or with value: private static $testClassProperty = 'bar';
private $testObjectProperty;
// or with value: private $testObjectProperty = 'baz';
// This won't work
// private static $need_to_have = get_some_info();
// -- since you only can execute functions/methods outside of class structure
// or within other functions/methods.
public function testMethod() {
// Writable access to TEST_CLASS_CONSTANT: not possible, since it's a constant.
// Writable access to $testClassProperty: possible with keywords self, parent, and static.
self::$testClassProperty = 'newbar';
// Writable access to $testObjectProperty: possible with keywords this or parent.
$this->testClassProperty = 'newbaz';
// Readable access to TEST_CLASS_CONSTANT: possible with keywords self, parent, and static.
echo self::TEST_CLASS_CONSTANT;
echo PHP_EOL;
// Readable access to $testClassProperty: possible with keywords self, parent, and static.
echo self::$testClassProperty;
echo PHP_EOL;
// Readable access to $testObjectProperty: possible with keywords this or parent.
echo $this->testClassProperty;
}
}
$testObject = new TestClass();
$testObject->testMethod();