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_Dependency Injection_Scope - Fatal编程技术网

PHP依赖属性作用域

PHP依赖属性作用域,php,oop,dependency-injection,scope,Php,Oop,Dependency Injection,Scope,在下面的类中,我有两个属性,$session和$client,它们是将依赖项注入其中的属性。在类中,它们被声明为public,但这是包含依赖项的属性的正确范围吗?PHP在这方面的最佳实践是什么,public、protected或private <?php /** * @file * Dummy example class. */ namespace App\My\Namespace; use App\My\Namespace\SessionInterface; use Guzzl

在下面的类中,我有两个属性,
$session
$client
,它们是将依赖项注入其中的属性。在类中,它们被声明为
public
,但这是包含依赖项的属性的正确范围吗?PHP在这方面的最佳实践是什么,
public
protected
private

<?php

/**
 * @file
 * Dummy example class.
 */
namespace App\My\Namespace;

use App\My\Namespace\SessionInterface;
use GuzzleHttp\ClientInterface;

/**
 * Class DummyClass
 * @package App\My\Namespace
 */
class DummyClass {

  /**
   * @var \App\My\Namespace\SessionInterface
   */
  public $session;

  /**
   * GuzzleHttp\ClientInterface;
   */
  public $client;

  /**
   * @param \SessionInterface $session
   * @param \GuzzleHttp\ClientInterface $client
   */
  public function __construct(
    SessionInterface $session,
    ClientInterface $client
  ) {
    $this->session = $session;
    $this->client = $client;
  }

}

您可以将它们设置为private(因此它们只能在类本身中更改),然后编写getter和setter来访问和注入它们

private $session;

public function getSession()
{
  return $this->session;
}

public function setSession($new_session)
{
  $this->session = $new_session;
}
这只是封装它们的一种方法,因此改变或查看变量值的唯一方法就是调用这些方法。这样做的好处是,您可以在这些方法中实现一些功能,而如果变量是公共的,则无法轻松实现这些功能。例如,假设您想确保
$new\u session
是正确的数据类型,您可以在设置它之前进行检查


您也可以将它们设置为protected,在本例中,它们的行为相同,但是当您有一个继承您的类并且需要访问这些变量的类时,您需要这样做。

将两者都设置为protected
并写入getter。