Php создает доступ к объекту, когда его ноль (например, __isset ()) - PullRequest
1 голос
/ 05 декабря 2011

Я понимаю, что __isset () для несуществующего свойства. Но я хочу, чтобы это существующее свойство было нулевым. По умолчанию это может быть хорошо:

class myClass
{
 public function __isset($name)
 {
  // create an object;
 }
}

$a = new myClass();
$a->mails->get();
$a->users->login();

но письма, объекты пользователя нигде не указаны. Так что это может быть решением, но в результате получается искаженный класс, он плохо отражается на диаграмме UML и т. Д. Реальное решение может быть:

class myClass
{
 public $users = null;
 public $mails = null;
 public function __isset($name)
 {
  // create an object BUT IT WONT TRIGGER!
 }
}

$a = new myClass();
$a->mails->get();  // <- fail!
$a->users->login();

только потому, что пользователи, письма объявляются. Но тогда это теперь отражает хорошую структуру! Синглтон уже может быть хорошим, но я не хочу этого. Есть ли способ вызвать что-то, когда что-то, к чему обращались, является нулевым?

Ответы [ 3 ]

1 голос
/ 05 декабря 2011

[править]

Если возможно задать свойства private, тогда получить к ним доступ через function, может быть, вы сможете что-то сделать:

public function get_Property($property_name) {
    if (!isset($this->{$property_name})) {
        echo "\n Property : '$property_name' cannot be accessed because it is not set or is null \n";
        // or create your object here then return it;
    else {
        return $this->{$property_name};
    }
}
1 голос
/ 05 декабря 2011

Хм, возможно, указав очевидное и оставив в стороне различные причины, по которым ваша реализация в данный момент не может работать, почему вы просто не делаете:

public function getMails()
{
    if (!$this->mails) {
        $this->mails = new ... whatever ...;
    }

    return $this->mails;
}

Если вам нужна какая-то служба для получения писем, введитеэто в конструкторе:

private $mailService;

public function __construct($mailService)
{
    $this->mailService = $mailService;
}

public function getMails()
{
    if (!$this->mails) {
        $this->mails = $this->mailService->magicallyFetchMails();
    }

    return $this->mails;
}

Не уверен, почему вы хотите выставить свойства вашего объекта.

1 голос
/ 05 декабря 2011

Я бы рекомендовал не нарушать инкапсуляцию и использовать геттеры и сеттеры вместо прямой адресации полей. Кроме того, это решит вашу проблему по определению.

...