В настоящее время я изучаю объектно-ориентированные концепции в PHP. и я нашел несколько примеров для методов получения и установки:
example1:
class UserModel{
private $id,$name,$email;
public function __construct(){}
public function setid($id){
$this->id=$id;
}
public function getid(){
return $this->id;
}
public function setname($name){
$this->name=$name;
}
public function getname(){
return $this->name;
}
public function setemail($email) {
$this->email=$email;
}
public function getemail() {
return $this->email;
}
}
example2:
class UserModel{
private $id,$name,$email;
public function __construct(){}
public function setid($id){
$this->id=$id;
}
public function getid(){
return $id;
}
public function setname($name){
$this->name=$name;
}
public function getname(){
return $name;
}
public function setemail($email) {
$this->email=$email;
}
public function getemail() {
return $email;
}
}
Как вы можете заметить, в первом примере, в методах получения, $this->property
возвращается а во вторых, $property
возвращается
Из руководства, Я знал о $ this, что он всегда будет ссылаться на вызывающий объект, поэтому в этом случае $this->property
будет гарантировать, что он вернет только свойство вызывающего объекта. Но, как в первом примере, return $property
также должна иметь ссылку на вызывающий объект.
Например, если я напишу:
UserModel $user = new UserModel();
$user->setemail("[email protected]");
$user->getemail();
тогда в обоих примерах метод getter всегда будет иметь ссылку на объект UserModel. Итак, они оба одинаковые или разные? если они разные, то в чем разница между ними? Кто-нибудь может объяснить, работают ли оба по-разному в разных сценариях?
Извините, но я новичок в ООП. пожалуйста помогите ребята.
Когда вы используете имя (идентификатор) в вашей программе, компилятор / интерпретатор должен получить его значение. Для этого он обращается к своей внутренней таблице пар имя => значение, называемой «область действия». Если имя не найдено в текущей области, оно обращается к другой области, если это возможно, до тех пор, пока не останется больше областей для просмотра — в этом случае он кричит вам, жалуясь на то, что имя не определено. Этот процесс называется «разрешением имени», и области видимости связаны в «цепочку областей действия».
Я не знаю Java, но я думаю, что его разрешение имен выглядит так:
foo
…Поэтому, когда вы пишете foo
в вашем коде, и нет локальной переменной foo
, Java будет искать поле с именем foo
,
Правила разрешения PHP разные и намного проще:
$foo
…global
Как видите, объявление класса не входит в цепочку областей видимости, поэтому $foo
никогда не будет ссылаться на поле — это всегда переменная. Вот почему вы всегда должны использовать явные $this->
при обращении к полям объекта.
PHP не уникален в этом отношении — другие языки сценариев используют явные this
тоже (self.foo
, @foo
) и причина в том, что эти языки не имеют объявлений, поэтому, когда у вас есть foo=1
для компилятора было бы невозможно решить, назначаете ли вы новое значение полю или вводите новую локальную переменную.
Во втором примере return $email;
возвращает неопределенную переменную, или другими словами: это не будет работать. Уважение к объекту UserModel является $this
переменная. Вы всегда должны использовать $this
если вы хотите получить доступ к методу или свойству класса.
Существует небольшая разница в двух утверждениях:
$this->$something;
Вышеприведенный оператор означает, что возвращается переменная i.e $ что-то, которая является частью объекта текущего класса. &this
в выражении означает текущий указатель или ссылку на текущий класс, а переменная в этой ссылке возвращается.
$something
В приведенном выше утверждении используется нормальная переменная, содержащая любое значение.
«This» — это ссылка на переменную класса «this», над которым вы работаете.
Таким образом, вернуть $ что-то не будет работать для вас. Он вернет ноль.
Пока $ this-> что-то вернет значение переменной этого класса.
Просто это способ ссылки на переменные в объекте. Переменные, которые вы создаете в теле класса, называются атрибутами объекта, и для доступа к ним вам нужно обратиться к объекту, которому они принадлежат. Поскольку вы не знаете, какая переменная объекта будет вызываться, поэтому вам нужно использовать переменную $ this->, где $ this — псевдопеременная.
Псевдопеременная $ this доступна, когда метод вызывается из контекста объекта. $ это ссылка на вызывающий объект (обычно это объект, которому принадлежит метод, но, возможно, другой объект, если метод вызывается статически из контекста вторичного объекта).
Тогда есть локальные переменные, которые вы можете использовать только в теле функции.
class Test {
private $attribute; //This attribute can be used in methods by using $this->attribute
function testFunction() {
$local; //This variable can be used only in this function
}
}
И по поводу твоего вопроса. В вашем примере 2 из UserModel метод getemail () возвращает локальную переменную, которая подходит, пока она определена, но не возвращает атрибут $ email.