Могу ли я создать класс PHP, в который нельзя динамически добавлять свойства во время выполнения? - PullRequest
2 голосов
/ 19 января 2012

Возьмем этот класс для примера:

<?php

class Person
{
    private $name = null;
    private $dob = null;

    public function __construct($name, $dob)
    {
        $this->name = $name;
        $this->dob = $dob;
    }
}

$potts = new Person('Matt', '01/01/1987');
var_dump($potts);

$potts->job = 'Software Developer'; // new dynamic property
var_dump($potts);

var_dump(get_object_vars($potts));

Вывод выглядит следующим образом:

object(Person)#1 (2) {
  ["name":"Person":private]=>
  string(4) "Matt"
  ["dob":"Person":private]=>
  string(10) "01/01/1987"
}

object(Person)#1 (3) {
  ["name":"Person":private]=>
  string(4) "Matt"
  ["dob":"Person":private]=>
  string(10) "01/01/1987"
  ["job"]=>
  string(18) "Software Developer"
}

array(1) {
  ["job"]=>
  string(18) "Software Developer"
}

Можно ли остановить добавление динамических свойств?Можно ли получить список свойств, определенных классом?(т.е. не динамические, добавленные свойства во время выполнения)

Ответы [ 2 ]

5 голосов
/ 19 января 2012

Попробуйте это

public function __set($name, $value){
 throw new Exception('Not allowed');
}
1 голос
/ 19 января 2012

Вы можете определить магический сеттер, который мешает определению свойств:

<?php

class Person
{
    private $name = null;
    private $dob = null;

    public function __set($name, $value) {
        //nothing here if you want nothing to happen
        //when a non-defined property is being set
        //otherwise, some error throwing
    }

    public function __construct($name, $dob)
    {
       $this->name = $name;
       $this->dob = $dob;
    }
}

Для просмотра свойств объекта или класса вы можете попробовать:

http://www.php.net/manual/en/function.get-class-vars.php

http://www.php.net/manual/en/function.get-object-vars.php

Надеюсь, это поможет!

...