使用私有类函数/变量的PHP静态方法

使用私有类函数/变量的PHP静态方法,php,static,methods,Php,Static,Methods,如果我在类中编写一个公共静态方法,例如 public static function get_info($type){ switch($type){ case'title': self::get_title(); break; } } 我必须将get_title()函数写为public public static function get_title(){

如果我在类中编写一个公共静态方法,例如

public static function get_info($type){
        switch($type){
            case'title':
                self::get_title(); 
                break;
        }
    }
我必须将get_title()函数写为public

public static function get_title(){
        return 'Title';
    }
否则我会得到错误:

Call to private method Page::get_title()
这让我觉得函数
get_info()
基本上是多余的。我希望能够从静态方法调用类中的私有方法以进行验证。这不可能吗

PHP>5.0 btw

!########编辑解决方案(但不回答问题)

如果您好奇,我的解决方法是在静态函数中实例化静态函数的类

所以,类名是Page我会这样做

public static function get_info($type){
            $page = new Page();
            switch($type){
                case'title':
                    $page->get_title(); 
                    break;
            }
        }
  public function get_title(){
            return 'Title';
        }

是的,这是不可能的-非静态方法需要一个对象来读取数据,而静态方法的要点是它没有附加这样的对象。您可以认为每个非静态方法都传递了一个隐式参数,即对象。如果您是从静态函数调用,那么您根本没有一个值可以将这个值传递给方法

更新
您可以使用私有静态功能-我不确定您的问题是否会涉及对私有和静态作为互斥概念的轻微误解

这实际上没关系,就我所知,这里没有什么不可能的。您的静态
get\u title()
方法可以是私有的,或者我遗漏了什么?如果您的两个静态方法
get_info()
get_title()
都在同一个类中(无论是否为静态),那么您的
get_title()
方法可以是私有的,并且您的代码仍然可以正常工作
get_info()
静态调用类内部的
get_title()
get_title()
在您的示例中不需要是公共的,除非它需要从静态类外部访问

访问(public、protected和private)适用于静态类(其中所有方法都是静态的)以及类实例

编辑:您不需要通过实例化类来实现私有访问

// Enable full error reporting to make sure all is OK
error_reporting(E_ALL | E_STRICT);

class MyStaticClass {

 public static function get_info($type){
  switch($type){
   case 'title':
    return self::get_title(); 
    break;
   }
 }


 private static function get_title() {
  return 'Title';
 }
}

// OK - get_info() calls the private method get_title() inside the static class
echo MyStaticClass::get_info('title');

// ERROR - get_title() is private so cannot be called from outside the class
echo MyStaticClass::get_title();

那么,类中的静态方法,或者实际上只是“名称空间”包装器中的实用程序函数?基本上,是的。他们还可以访问静态数据(虽然这是全局变量的另一个词,所以通常的警告适用)?我不确定这是否回答了这个问题?如果问题是“这不可能吗”,“是的,这不可能”至少在语法上看起来是一个有效的答案:)当然,语法不是一切,所以我试图论证,即使它在语法上由于某种奇怪的原因而可能,这样一个电话可能意味着什么,没有任何语义学上的解释。我觉得这是可能的,事实上,我可以(在一些检查之后)确认我已经多次这样做了。你确定
get\u info()
get\u title()
在同一个类中吗?如果
get_title()
驻留在一个超类中,它将不起作用……那么,当您在被调用的非静态函数中引用$this时,会发生什么情况?@raphael。。。我试过了,伙计。我在上面遇到的错误是调用get_title()方法“private”的结果。@nicolas78-True,您不能引用
$this
,因为没有对象实例,您也不能使用
$this
调用静态方法。但是您可以使用
self::
引用该方法所在的静态类,以便调用该静态类中的其他方法(private、protected或public)。@Jascha-我也尝试了您的代码(两个方法都在同一个类中),它可以使用private访问正常
get_title()