如何使变量类可访问(面向对象编程PHP)

时间:2014-05-22 13:15:41

标签: php oop object

我有一个名为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
  }

}

忘记提及:我想让它私有化,我只在静态函数上调用变量,所以我不能使用构造函数。

4 个答案:

答案 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全班级可访问”。但这不是必需的。

您要找的是对象和课程propertiesclass 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();