第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在 PHP 中實(shí)現(xiàn)相同的方法重載行為的最佳方法是什么?

在 PHP 中實(shí)現(xiàn)相同的方法重載行為的最佳方法是什么?

PHP
函數(shù)式編程 2022-10-22 15:43:53
假設(shè)我有兩個(gè)名為Userand的類Product。這兩個(gè)都需要保存在數(shù)據(jù)庫(kù)中。第三個(gè)類稱為PersistencyHandler處理所有數(shù)據(jù)庫(kù)交互(為了遵守單一責(zé)任原則和依賴倒置)。這是這個(gè)類的樣子:<?php/** * Class PersistencyHandler * Handles database using PDO API */class PersistencyHandler{    /**     * PDO connection used to save objects into.     * @var $conn PDO     */    private $conn;    /**     * PDODatabaseSaver constructor.     * @param $conn PDO     */    public function __construct($conn){        $this->pdo = $conn;    }    /**     * Saves the given object in the database     * @param $object mixed     */    public function save($object){        // as PHP does not support classic method overloading for different        // types of objects, this is the cleanest solution I've been able to find.        // And it's still pretty dirty...        if($object instanceof Product) {            $this->saveProduct($object);        } else if($object instanceof User) {            $this->saveUser($object);        } else {            throw new UnsupportedOperationException("Cannot save object, unsupported type."); // custom class        }    }    private function saveProduct(Product $object){        // save Product into database    }    private function saveUser(User $object){        // save User into database    }}?>我來(lái)自 Java 經(jīng)驗(yàn),我確信使用instanceof是一種非常糟糕的做法(至少在 Java 中)。例如,在 Java 中,我曾經(jīng)使用重載方法來(lái)解決此類問(wèn)題。我檢查了php.net和其他網(wǎng)站(包括這個(gè)網(wǎng)站),但我沒有找到一個(gè)很好的答案來(lái)回答我的問(wèn)題:以正確的方式實(shí)現(xiàn)上述代碼的相同行為的更好方法是什么?請(qǐng)注意,我有一個(gè)帶有單個(gè)參數(shù)的方法,調(diào)用的方法由參數(shù)的類型決定。
查看完整描述

1 回答

?
藍(lán)山帝景

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊

一種解決方案是使用動(dòng)態(tài)調(diào)用(類似于 Java 中的反射):


public function save($object)

{

    $mtd = 'save'.get_class($object);

    if(method_exists($this, $mtd))

        call_user_func(array($this, $mtd), $object);

    else

        throw new UnsupportedOperationException("Cannot save object, unsupported type.");

}

注意:如果您使用命名空間,則需要修改代碼(get_class() 返回限定名稱)。


查看完整回答
反對(duì) 回復(fù) 2022-10-22
  • 1 回答
  • 0 關(guān)注
  • 103 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)