当没有类范围处于活动状态时无法访问 self::
Posted
技术标签:
【中文标题】当没有类范围处于活动状态时无法访问 self::【英文标题】:Cannot access self:: when no class scope is active 【发布时间】:2012-06-30 14:09:52 【问题描述】:我正在尝试在公共静态函数中使用 php 函数,就像这样(我已经缩短了一点):
class MyClass
public static function first_function()
function inside_this()
$some_var = self::second_function(); // doesnt work inside this function
// other code here...
// End first_function
protected static function second_function()
// do stuff
// End second_function
// End class PayPalDimesale
那时我收到错误“无法访问 self:: 当没有活动的类范围时”。
如果我在inside_this
函数之外调用second_function
,它可以正常工作:
class MyClass
public static function first_function()
function inside_this()
// some stuff here
$some_var = self::second_function(); // this works
// End first_function
protected static function second_function()
// do stuff
// End second_function
// End class PayPalDimesale
我需要做什么才能在inside_this
函数中使用second_function
?
【问题讨论】:
你试过闭包吗?function inside_this() use($self)
我意识到self
不是变量为时已晚...
【参考方案1】:
尝试将您的第一个函数更改为
public static function first_function()
$function = function()
$some_var = self::second_function(); // now will work
;
///To call the function do this
$function();
// other code here...
// End first_function
【讨论】:
【参考方案2】:适用于 PHP 5.4:
<?php
class A
public static function f()
$inner = function()
self::g();
;
$inner();
private static function g()
echo "g\n";
A::f();
输出:
g
【讨论】:
他是protected
,而不是private
。
@Cole Johnson,private 的限制更多,这就是我在示例中使用它的原因。
@Matthew 是否有任何文档说明为什么这在 5.3 版本的 php 中不起作用,而它在 5.4 版本中起作用
@aravind.udayashankara,我不确定它是否明确提及,但在这里你会看到 PHP 5.4 在闭包中引入了$this
:php.net/manual/en/migration54.new-features.php。不是同一件事,但它是相关的。
@Matthew 非常感谢您的分享【参考方案3】:
这是因为 PHP 中的所有函数都具有全局作用域 - 即使它们是在函数内部定义的,它们也可以在函数外部调用,反之亦然。
所以你必须这样做:
function inside_this()
$some_var = MyClass::second_function();
【讨论】:
@JohnRobinson 那是因为该方法受到保护。 @xdazz,有没有办法将 MyClass 保存到变量中并将其传递给函数,而不是将类名MyClass
硬编码到代码中? (否则如果我们更改类的名称,我们需要在整个文件中搜索并替换“MyClass”)以上是关于当没有类范围处于活动状态时无法访问 self::的主要内容,如果未能解决你的问题,请参考以下文章
如何避免此 PDO 异常:在其他无缓冲查询处于活动状态时无法执行查询
Laravel - PDO Prepared Statement - 在其他无缓冲查询处于活动状态时无法执行查询
Ios:当应用程序处于非活动状态时,如何让我的应用程序返回根视图