【问题标题】:Is it possible to change a property of a class outside of the class? (PHP)是否可以在类之外更改类的属性? (PHP)
【发布时间】:2013-10-12 20:16:50
【问题描述】:

我对 OOP PHP 非常缺乏经验,但这是我的问题...假设我有一个具有一个属性的类:

class myClass {

    public $property = array();

    public function getProperty() {
        return $this->property;
    }

}

如何在不以任何方式更改类本身的情况下更改 $property 的值,或者通过实例化一个对象,然后更改其属性。还有其他方法吗?使用范围解析?

希望这是有道理的,任何帮助将不胜感激。

【问题讨论】:

  • 你的意思是static variables
  • 如果不实例化类,就没有属性,因为没有对象。你想改变类定义本身吗?这不能直接在php中完成。您需要扩展类并覆盖属性并调用扩展类
  • 虽然您可以这样做,但这是一种不好的做法,因为有两件事:它破坏了封装,并引入了另一种形式全局状态

标签: php oop properties


【解决方案1】:

我希望这就是你要找的东西

<?php

class myClass {

    public $property = array();

    public function getProperty() {
        print_r($this->property);
    }

}


$a = new myClass();
$x = array(10,20);

$a->property=$x; //Setting the value of $x array to $property var on public class
$a->getProperty(); // Prints the array 10,20

编辑:

正如其他人所说,是的,您需要将变量声明为 static(如果您想修改变量而不创建类的新实例或扩展它)

<?php
class MyClass {
    public static $var = 'A Parent Val';

    public function dispData()
    {
        echo $this->var;
    }
}

echo MyClass::$var;//A Parent Val
MyClass::$var="Replaced new var";
echo MyClass::$var;//Replacced new var
?>

【讨论】:

  • 我认为这不是他想要的。他正在寻找一种在不实例化对象的情况下更改property 的方法。
  • 静态属性不能改吗?
  • 不在课堂之外。如果存在 setter 方法,则可以调用它,但如果在下一行调用 getter,则它不会具有该值,因为每次调用都是针对类的新静态“渲染”对象。可能可以在一次调用中链接方法,但我不熟悉这种方法。
  • @Anthony phpFiddle 只要静态成员可见,就可以在类外访问它。您要链接到的那个问题是尝试执行您无法使用静态方法执行的链,直到您有一个实例可供链接。
  • 因此它们是静态的,与函数中的静态变量相同。很高兴知道。我仍然认为 OP 正在寻找一种方法来覆盖 3rd 方类的属性,但是如果目标只是分配一个在新对象/静态调用中持续存在的值,那么您的解决方案就可以工作。
【解决方案2】:

你想要的是一个静态成员

class MyClass {
   public static $MyStaticMember = 0;

   public function echoStaticMember() {
      echo MyClass::$MyStaticMember;
      //note you can use self instead of the class name when inside the class
      echo self::$MyStaticMember;
   }

   public function incrementStaticMember() {
      self::$MyStaticMember++;
   }
}

然后你像访问它

MyClass::$MyStaticMember = "Some value"; //Note you use the $ with the variable name

现在,无论静态成员设置为什么,任何实例和所有内容都将看到相同的值,因此例如以下

function SomeMethodInAFarFarAwayScript() {
   echo MyClass::$MyStaticMember;
} 

...

MyClass::$MyStaticMember++; //$MyStaticMember now is: 1

$firstClassInstance = new MyClass();

echo MyClass::$MyStaticMember; //will echo: 1
$firstClassInstance->echoStaticMember(); //will echo: 1

$secondInstance = new MyClass();
$secondInstance->incrementStaticMember(); // $MyStaticMember will now be: 2

echo MyClass::$MyStaticMember; //will echo: 2
$firstClassInstance->echoStaticMember(); //will echo: 2
$secondInstance->echoStaticMember(); //will echo: 2

SomeMethodInAFarFarAwayScript(); //will echo: 2

PHPFiddle

【讨论】:

  • 谢谢!很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 2020-11-05
  • 1970-01-01
  • 2019-07-17
  • 2021-03-20
  • 2015-05-13
相关资源
最近更新 更多