PHP中的完整OOP-内部方法

PHP中的完整OOP-内部方法,php,oop,Php,Oop,在我的命名空间中,有没有专业的方法将方法的可见性设置为internal/package 例如: namespace ExampleFramework; class Request { ... public function getResponse() { return new Response(...); // Should work } } class Response { internal function __construct(...) {

在我的命名空间中,有没有专业的方法将方法的可见性设置为internal/package

例如:

namespace ExampleFramework;

class Request {
   ...

   public function getResponse() {
       return new Response(...); // Should work
   }
}

class Response {
   internal function __construct(...) {
      ...
   }
}

namespace AnotherFramework;

$request = new Request();
$response = $request->getResponse(); // Should work
$wrongResponse = new Response(...); // Should NOT work

您可以在
Response
类中使用私有构造函数:

class Request {
   ...

   public function getResponse() {
       return Response::getInstance(...);
   }
}

class Response {

  private function __construct(...) {
  }

  public static getInstance(...) {
    return new Response(...);
  }

}

看起来像是包可见性。但是php没有。:^)

你可以用。比如说

namespace One
    {

    class Request
        {

        public function getResponse()
            {
            return new Response();
            }

        }

    class Response
        {

        public function __construct()
            {
            $debug = debug_backtrace();
            if (count($debug) < 2 
                || !isset($debug[1]['class']) 
                || strpos($debug[1]['class'], __NAMESPACE__ . '\\') !== 0)
                {
                die('Invalid context');
                }
            echo 'Created' . PHP_EOL;
            }

        }

    }

namespace Two
    {
    $request = new \One\Request();
    $response = $request->getResponse(); // Should work
    $wrongResponse = new \One\Response(); // Should NOT work
    }
namespace-One
{
类请求
{
公共函数getResponse()
{
返回新的响应();
}
}
班级反应
{
公共函数构造()
{
$debug=debug_backtrace();
如果(计数($debug)<2
||!isset($debug[1]['class']))
||strpos($debug[1]['class'],\uuuu NAMESPACE\uuuu.'\\')!==0)
{
die(“无效上下文”);
}
echo'Created'。PHP_EOL;
}
}
}
名称空间二
{
$request=new\One\request();
$response=$request->getResponse();//应该可以工作
$ErrorResponse=new\One\Response();//不应工作
}

PHP没有一种语言结构来强制实现这种可见性。在我看来,您最好使用phpDocumentor,并希望API用户遵守合同:

@internal
标记可以用作
@api
标记的对应项,表明相关结构元素仅用于此软件的内部工作


不,PHP没有这个功能。“专业”只是意味着你不需要做更多的事情就可以得到报酬。而且在我看来,你是一个非常不专业的人。所以,Soncideing你给它贴上了标签OOP:你到底为什么要这么做?我可以告诉你为什么:在框架中,有一些类只能由框架内部类创建(对象),这是很正常的,例如一个XMLReader,它将XML结构作为类XMLElement的对象提供给你。framwork调用addAttribute(…)或addChild(…)等方法,但framwork的用户应该只能“读取”getAttributes()等方法,而不能对其进行操作。所以“write”-方法既不是公共的也不是私有的,它们必须是内部的/包的。你确定你不是在简单地谈论私有的/受保护的setter和公共getter吗?是的,但这不能保证它是内部的。我只需要编写$ErrorResponse=Response::getInstance(),它就可以工作,无论我在哪里键入它。此外,可以有多个响应,而不仅仅是一个响应。所以单例在这种情况下并没有太大帮助。你们唯一能做的就是使用反射并检查你们的方法。但这是一个非常重要的解决方案。@LucaNateMahler这种模式不是一个单一模式,因为它每次都会创建新对象。是的,你是对的。但是它和普通构造函数没有区别,因为它也是公共的。@hsz可能是这样,但它与单例有完全相同的问题,因此在OOP中没有位置