- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
http://codepad.viper-7.com/I0Zqoi
我不明白这有什么问题或如何解决它或为什么。对编程了解一点的人可以解释一下幕后发生的事情,比如在解释器层面吗?另外,我该如何解决我的问题,为什么我需要按照更正的方式编写我的代码?你能用人类的语言告诉我这有什么问题以及如何让它变得更好吗?我想我的书解释得不好,里面的代码也不起作用。 :/谢谢。
class A
{
private $foo = 'bar';
function read()
{
echo self::$foo;
}
}
$a = new A();
a::read();
Strict Standards: Non-static method A::read() should not be called statically in /code/I0Zqoi on line 13
Fatal error: Access to undeclared static property: A::$foo in /code/I0Zqoi on line 8
唯一的解决方法似乎是在方法前面添加“static”。显然,非静态方法不能通过静态方式访问(例如,类 A{function read(){echo "whatever"};} 不能通过 a::read() 访问,因为 -> 运算符是必需的)。此外,对象代码不能访问静态属性,即使它们存在于函数中(例如,class A{static $variable; function read(){echo $this->variable};} a->read(); won ' 不起作用,因为 -> 运算符用于访问调用静态属性的函数。)。通过将方法和属性都更改为静态,可以通过静态方式访问该方法。通过将方法和属性都更改为非静态,可以通过对象实例化来访问其中任何一个。调试器抛出错误对我来说没有意义,因为我的书说可以通过对非静态方法的目标代码调用从非静态方法调用静态属性。那么,调试器坏了吗?因为我已经尝试了每一种组合,而且代码似乎只有在方法和属性都是静态或非静态的情况下才有效。 :(((
最佳答案
严格标准部分是因为 a::read()
是在静态上下文中使用 ::
调用的。在将 $a
声明为 A
的类实例之后,您应该使用 -> 对变量调用
运算符:read()
方法
// Proper non-static method call
$a = new A();
$a->read();
在类定义中,$foo
被声明为私有(private)属性,但没有static
关键字。然后使用 ::
运算符而不是 ->
在静态上下文中引用它。访问它的正确方法是L
// Proper reference to non-static $foo
function read() {
echo $this->foo;
}
static
到底是什么意思?静态方法和属性是指所有当前和 future 的类实例共享的类方法和属性。如果 A::$foo
被声明为:
private static $foo;
那么您的代码中所有类 A
将只有一个 $foo
。更改 $foo
会影响类 A
的所有实例,并且甚至无需创建该类的实例即可访问 $foo
(如 >新A();
)
同样,可以在不创建类实例的情况下调用静态方法,因为它们不会修改非静态的类属性。
// Static method call:
A::read();
要将属性和方法声明为static
,只需添加static
关键字:
// Property
private static $foo;
// Method
public static function foo() {}
编辑更多示例:
class A
{
// Private property (non-static)
private $foo;
// Public property (static)
public static $bar = 12345;
// Public (non-static) function to access private $foo
public function getFoo() { return $this->foo; }
// Public (non-static) function to set private $foo
public function setFoo($newfoo) { $this->foo = $newfoo; }
// Static function
public static function incrementBar() { self::$bar++; }
}
现在看看它的实际效果:
// We haven't created any class instances yet (with the 'new' operator)
// But we can access the static properties & functions:
echo A::$bar . " ";
// prints 12345
A::incrementBar();
echo A::$bar . "\n";
// prints 12346
// Now we'll start working with class instances.
// Create 2 instances of class A
$a = new A();
$a->setFoo(8888);
$b = new A();
$b->setFoo(9999);
// It's a violation of strict standards to call getFoo() statically
// And it's meaningless to do so, because $foo only exists inside a class instance!
// Can't do this... Issues a strict warning since we're calling non-static getFoo() statically
//echo A::getFoo();
// But we can call getFoo() on the class instances:
echo $a->getFoo() . " " . $b->getFoo() . "\n";
// Prints 8888 9999
// Remember $bar was 12346...
echo $a::$bar . " " . $b::$bar . "\n";
// Prints 12346 12346
// Now modify the static property $bar again
// This affects all class instances.
A::incrementBar();
echo $a::$bar . " " . $b::$bar . "\n";
// Prints 12347 12347
我也把这整件事都塞进了键盘:http://codepad.viper-7.com/tV6omK
您正在阅读的书一定没有讲究严格的标准。如果非静态函数不尝试访问/修改非静态属性,您可以成功地静态调用它,但它会发出严格警告。如果非静态函数确实使用 $this->property
修改或访问非静态属性,这将是一个 fatal error 。你不能那样做。
在PHP的error_reporting
中,show all errors的E_ALL
设置实际上并不包含严格警告。这必须通过 E_ALL & E_STRICT
来完成。
关于PHP:为什么我会收到有关静态属性的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6337543/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
在 C# 静态方法中是否有一种方法可以引用定义该方法的类型? 在实例方法中,您可以通过以下方式确定类型: public void Foo() { Type type = this.GetTyp
WPF:静态、动态资源以及资源词典 静态资源与动态资源 我们常常会使用样式或者控件模板放在Window.Resources中,比如这样: 静态资源与动态资源使用如下: <Window
任何人都知道如何在共享/静态函数中动态加载控件?该函数本身位于 mustinherit/abstract 类中。 (这是 VB 中的 ASP.NET 项目)我想做这样的事情: VB: Publ
在我看来,静态/强类型编程语言最宝贵的一点是它有助于重构:如果/当您更改任何 API,那么编译器会告诉您该更改破坏了什么。 我可以想象用运行时/弱类型语言编写代码......但我无法想象没有编译器的帮
正如我的名字所暗示的,我是一名 .NET 开发人员,但我对 Java 的兴趣越来越大,并且我有兴趣学习更多其他语言,因为这有助于我学习更多关于编程的知识。 无论如何,我的问题是:不带参数/不使用状态的
我在java中使用WireMock来 stub POST请求。该请求返回一个存储在我本地的 json 正文文件。 stub 看起来像这样: wireMockServer.stubFor(get(url
Python 是否有类构造函数的机制,即每当首次引用类时(而不是创建该对象的实例时)调用的函数?我知道其他一些语言中也存在这种情况,但我还没有在 Python 中遇到过。 基本上,我想初始化该函数中的
Python 是否有类构造函数的机制,即每当首次引用类时(而不是创建该对象的实例时)调用的函数?我知道其他一些语言中也存在这种情况,但我还没有在 Python 中遇到过。 基本上,我想初始化该函数中的
这个问题已经有答案了: What is the difference between dynamic and static polymorphism in Java? (14 个回答) 已关闭 4 年
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Static initializer in Java 我想知道这个静态的东西(抱歉,这是我第一次遇到这个)对一个类有
如果c++应用程序是按以下方式组织的 //file1.cpp static Y sgObj = X::getInitObject(0); //declared in file scope //fil
我有一个抽象类(AvergedDataRecord),我需要进一步抽象(DataRecord),这样我就可以将它扩展到原始类和一个新的具体类(SummedDataRecord),并且我在获取某些方法时
我正在尝试制作一个字符串枚举。这是我到目前为止所得到的, private class TypedEnum : IEnumerable { public IEnumerator GetEnume
我选修了一门名为“安全代码”的类(class),在下一个作业中,我们应该对一些 C 文件和 JavaEE Web 项目进行静态/动态分析。 我检查了“源监视器”并在 C 文件上运行它,但是(除非我不知
我有两个类,一个是登录类,一个是用户类。在 loggedIn 类中,我想显示我在用户登录时所做的共享首选项。 loginPrefs = getSharedPreferences("loginprefe
我在同一个 Activity 中有两个静态 fragment ,在“fragmentA”中我有一个自定义列表,当一个项目被点击时必须在“fragmentB”中出现一个细节,细节只在我改变屏幕方向时出现
在 Java 中是未修改方法变量,缺少final,每次都重新初始化限定符 静态方法 实例方法 如果 1. 或 2.(或两者)的答案是 final 限定符允许 Java 执行优化并存储方法变量只有一次?
我有两个类相互交互。第一个是中心的,如下: public class Datenbank { double winkelPanel = 0; double groessePanel = 0; doub
我有一个 mysql 数据库,它连接基于 Web 的 php 应用程序和 FoxPro 应用程序(是的,foxpro)。在之前的“开发人员”被解雇后开始处理这个问题。 无论如何,我熟悉 AES_Enc
我是一名优秀的程序员,十分优秀!