目錄
CEO::__construct begin!
CEO::__construct end!
首頁 後端開發 php教程 关于_set()的有关问题

关于_set()的有关问题

Jun 13, 2016 pm 01:05 PM
name property set

关于__set()的问题





PHP code
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
<?php namespace longli;

class Employee  {
    private $name;
    public function __set($xproName, $value) {
        echo '<p>Employee::__set is called $proName=='.$xproName.', $value=='.$value.'';
        $this->xproName = $value;
    }
}
class CEO extends Employee {
    function __construct($name="") {
        echo '<h2 id="CEO-construct-begin">CEO::__construct begin!</h2>';
        $this->name = $name;
        echo '<h2 id="CEO-construct-end">CEO::__construct end!</h2>';
    }
         
}

$boss = new CEO("Blus");
?>

登入後複製




上面的代码,__set()被莫名其妙执行了两次,请问这是为什么呢? 输出结果为:

CEO::__construct begin!

Employee::__set is called $proName==name, $value==Blus

Employee::__set is called $proName==xproName, $value==Blus

CEO::__construct end!








------解决方案--------------------
__set( $property, $value ) : 给一个未定义的属性赋值时调用 
你赋值了两次当然就执行两次了。
------解决方案--------------------
第一次给未定义的类成员$name赋值: $this->name = $name; 调用一次
在调用重载方法__set的时候,第二次给未定义的类成员 $xproName赋值: $this->xproName = $value; 调用一次。
我想你的本意是这样: 
PHP code
public function __set($xproName, $value) {
        echo '<p>Employee::__set is called $proName=='.$xproName.', $value=='.$value.'</p>';
        // 这个 $xproName是一个变量,内容是变量名。 详见手册中 可变变量
        $this->$xproName = $value;
    }
<br><font color="#e78608">------解决方案--------------------</font><br>预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,以及检查属性的“__isset()”<br><br><br>//__get()方法用来获取私有属性<br>private function __get($property_name)<br>{<br>if(isset($this->$property_name))<br>{<br>return($this->$property_name);<br>}else<br>{<br>return(NULL);<br>}<br>}<br>//__set()方法用来设置私有属性<br>private function__set($property_name,$value)<br>{<br>$this->$property_name=$value;<br>}
<br><font color="#e78608">------解决方案--------------------</font><br>你仍然没弄清楚__set()的作用,当你为类成员属性$xproName赋值后,它已经不再是未定义了。所以不具备死循环的条件。<br>我觉得用__set()来实现的封装是过分的封装,为什么要在类外部修改一个隐藏的属性?为什么不设为公有?<br><br>至于说 事实上,为了“添加一个隐藏属性”<br>添加一个隐藏的属性?你的程序需要的属性名难道不是固定的吗?你应该先声明该隐藏属性。<br>
<br><font color="#e78608">------解决方案--------------------</font><br>所用面向对象的语言中都对对象的每个属性设有 Access 和  Assign 方法,以便开发者灵活的控制对象的行为。由于 php 不是面向对象的语言,所以虽然粗糙的提供了 __get 和 __set 方法,但与 Access 和  Assign 相比还是有很大差距的<br>与 Access 和  Assign 一样,如果仅仅将 __get 和 __set 作用于对象属性的存取,就大有画蛇添足的嫌疑<br>  __get 和 __set 在对象中的作用是在存取属性的同时隐式的之行一些方法,而无需显式的调用方法<br> <div class="clear">
                 
              
              
        
            </div>
登入後複製
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1273
29
C# 教程
1252
24
詳解MyBatis動態SQL標籤中的Set標籤功能 詳解MyBatis動態SQL標籤中的Set標籤功能 Feb 26, 2024 pm 07:48 PM

MyBatis動態SQL標籤解讀:Set標籤用法詳解MyBatis是一個優秀的持久層框架,它提供了豐富的動態SQL標籤,可以靈活地建構資料庫操作語句。其中,Set標籤是用來產生UPDATE語句中SET子句的標籤,在更新作業中非常常用。本文將詳細解讀MyBatis中Set標籤的用法,以及透過具體的程式碼範例來示範其功能。什麼是Set標籤Set標籤用於MyBati

PHP Notice: Undefined property: 的解決方法 PHP Notice: Undefined property: 的解決方法 Jun 22, 2023 pm 02:48 PM

在使用PHP編寫程式碼時,我們可能會遇到「Notice:Undefinedproperty」這個錯誤提示。這個錯誤提示意味著我們正在存取一個未定義的屬性,通常是因為該屬性在程式碼中尚未被初始化。那麼,該如何解決這個問題呢?以下是幾種可能的解決方法:初始化屬性這是解決問題的最簡單方法。在程式碼中明確地初始化屬性,可以確保它在使用前已經被定義。例如:class

PHP Notice: Trying to get property of non-object - 解決方法 PHP Notice: Trying to get property of non-object - 解決方法 Aug 17, 2023 am 09:27 AM

PHPNotice:Tryingtogetpropertyofnon-object-解決方法在PHP開發過程中,我們可能會遇到一個常見的錯誤提示:Tryingtogetpropertyofnon-object(試圖取得非物件的屬性)。這個錯誤通常是由我們對一個非物件類型的變數嘗試存取屬性(或呼叫方法)時引起的。這篇文章將向你介紹這

javascript怎麼從set刪除元素 javascript怎麼從set刪除元素 Jan 12, 2022 am 10:56 AM

刪除元素的方法:1、使用delete(),可從Set物件中刪除指定的元素,語法「setObj.delete(value);」;2、使用clear(),可刪除Set物件中的所有元素,語法「setObj.clear();」。

Vue中的TypeError: Cannot read property 'XXX' of null,該怎麼辦? Vue中的TypeError: Cannot read property 'XXX' of null,該怎麼辦? Nov 25, 2023 pm 01:21 PM

Vue是一種流行的用於建立使用者介面的JavaScript框架。在開發過程中,我們可能會遇到各種錯誤和異常。其中一個常見的錯誤是"TypeError:Cannotreadproperty'XXX'ofnull"。在本文中,我們將探討這個錯誤的原因以及如何解決它。首先,讓我們來了解這個錯誤背後的原因。當我們嘗試存取一個物件的屬性或方法時,如果該對

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

盤點Python編程中dict和set常用用法 盤點Python編程中dict和set常用用法 Jul 25, 2023 pm 04:52 PM

本文基於Python基礎,介紹如何去使用dict和set,使用key-value儲存結構的dict在Python中非常有用,選擇不可變物件作為key很重要,最常用的key是字串。

Vue中的TypeError: Cannot read property 'XXX' of undefined,該怎麼辦? Vue中的TypeError: Cannot read property 'XXX' of undefined,該怎麼辦? Nov 25, 2023 am 10:56 AM

Vue中的TypeError:Cannotreadproperty'XXX'ofundefined,該怎麼辦?對於使用Vue開發的前端開發者來說,可能在開發過程中經常遇到TypeError:Cannotreadproperty'XXX'ofundefined的錯誤。這個錯誤通常出現在嘗試存取一個未定義(undefined)的屬性時。在

See all articles