Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否可以在类之外更改类的属性?(菲律宾)_Php_Oop_Properties - Fatal编程技术网

Php 是否可以在类之外更改类的属性?(菲律宾)

Php 是否可以在类之外更改类的属性?(菲律宾),php,oop,properties,Php,Oop,Properties,我对OOP PHP非常缺乏经验,但我的问题是……假设我有一个属性的类: class myClass { public $property = array(); public function getProperty() { return $this->property; } } 如何在不改变类本身的情况下更改$property的值,或者通过从类中实例化一个对象,然后更改其属性。还有别的办法吗?使用范围解析 希望这是有意义的,任何帮助都将不胜感

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

class myClass {

    public $property = array();

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

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


希望这是有意义的,任何帮助都将不胜感激。

我希望这就是您所寻找的

<?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

我希望这就是你要找的

<?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

您需要的是静态成员

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

您需要的是静态成员

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

你是说?如果你不实例化这个类,就没有属性,因为没有对象。是否要更改类定义本身?这不能直接在php中完成。您需要扩展类并覆盖属性并调用扩展类。虽然您可以这样做,但这是一种糟糕的做法,因为有两件事:它破坏了封装,并引入了另一种形式的全局状态。您的意思是?如果您不实例化类,则没有属性,因为没有对象。是否要更改类定义本身?这不能直接在php中完成。您需要扩展类并覆盖属性并调用扩展类。虽然您可以这样做,但这是一种糟糕的做法,因为有两个原因:它破坏了封装,并引入了另一种形式的全局状态。我认为这不是他想要的。他正在寻找一种不实例化对象而改变属性的方法。静态属性不能改变吗?不能在类之外。如果存在setter方法,则可以调用该方法,但如果在下一行调用getter,则该方法将不具有该值,因为每次调用都是针对类的新静态呈现对象的。在一次调用中链接方法是可能的,但我不熟悉这种方法。@Anthony只要静态成员可见,就可以在类外访问它。你链接到的问题是,在你有一个实例来链接之前,你不能用静态方法来做链。因此,它们是静态的,与函数中的静态变量具有相同的意义。很高兴知道。我仍然认为OP正在寻找一种覆盖第三方类属性的方法,但是如果目标只是为新对象/静态调用分配一个持久的值,那么您的解决方案是有效的。我不认为这是他想要的。他正在寻找一种不实例化对象而改变属性的方法。静态属性不能改变吗?不能在类之外。如果存在setter方法,则可以调用该方法,但如果在下一行调用getter,则该方法将不具有该值,因为每次调用都是针对类的新静态呈现对象的。在一次调用中链接方法是可能的,但我不熟悉这种方法。@Anthony只要静态成员可见,就可以在类外访问它。你链接到的问题是,在你有一个实例来链接之前,你不能用静态方法来做链。因此,它们是静态的,与函数中的静态变量具有相同的意义。很高兴知道。我仍然认为OP正在寻找一种覆盖第三方类属性的方法,但是如果目标只是为新对象/静态调用分配一个持续存在的值,那么您的解决方案是有效的。谢谢!很好的解决方案,谢谢!很好的解决方案。