Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP面向对象->;构造中的if语句与直接调用函数(性能和未来)_Php_Class_Oop_Architecture - Fatal编程技术网

PHP面向对象->;构造中的if语句与直接调用函数(性能和未来)

PHP面向对象->;构造中的if语句与直接调用函数(性能和未来),php,class,oop,architecture,Php,Class,Oop,Architecture,我有一个用户类,它有用户名、电子邮件和用户级别,它有诸如ChangePassword、ChangeEmail、ChangeUserLevel、DeleteUser和Adduser等方法 当前,该类根据发布到具有$user=new user(名称、电子邮件、安全级别)的页面上的数据执行它需要执行的任何操作。因此,例如,如果您已将更改密码表单提交到在_构造中具有实例化用户对象的页面,那么它有几个if语句->例如: If ($_POST['changePassword']) { $this -

我有一个用户类,它有用户名、电子邮件和用户级别,它有诸如ChangePassword、ChangeEmail、ChangeUserLevel、DeleteUser和Adduser等方法

当前,该类根据发布到具有
$user=new user(名称、电子邮件、安全级别)
的页面上的数据执行它需要执行的任何操作。因此,例如,如果您已将更改密码表单提交到在_构造中具有实例化用户对象的页面,那么它有几个if语句->例如:

If ($_POST['changePassword']) {
    $this -> changePassword(); }
对于该类的其他方法也是如此。所以我的问题是:

这是处理这些事件的一种好方法,还是最好采取以下措施:

$user = new User(name,email,secure_level);
if ($_POST['changePassword']) {
   $user->changePassword(); }
我所说的更好是指性能和未来可能的陷阱

(我有以类似方式组织的登录类、注册类和网页类)


提前感谢您-我刚刚开始学习PHP,所以我对自己所做的任何事情都不确定。

有很多方法可以做到这一点。我个人在我的用户类中使用了一个函数:

updateUser($username = null, $password = null, $email = null)

然后,任何非空的字段都将被更新

是的,第二种选择更好
User
是一个模型类(业务逻辑抽象),因此不应直接与web请求(
$\u POST
和friends)交互,这是控制器的任务,而不是模型的任务


想象一下,在以后的某个时候,您必须编写一个管理用户的命令行脚本。如果您保持
User
界面没有web逻辑,您可以在此脚本中重用它,只需更改控制器(将
$\u POST[xxx]
替换为
$argv
或类似内容).

我只是想补充一点,我这样做的原因是因为我的所有类都会产生错误和系统消息,这些消息会显示给用户,而这些类会自己显示它们;对于我来说,这只是简化了对用户的反馈,但我思想开放,如果这不是一个好的选择,我会重写消息处理。这是处理更新用户信息的一种非常简洁的方式,很遗憾我还不能升级;/但我不知道函数如何知道我传递给它的参数是哪一个?或者我需要做一些类似updateUser(null,$password,null)的事情;要更改密码?是,必须指定null。默认值仅在您提供的最后一个参数之后有效。所以,如果你只是更新用户名,你可以去updateUser($username);其余的将被假定为空。谢谢你,但出于某种原因,我不能接受2个答案,@georg-answer更完整,一旦我获得更多的声誉,我会给你投票。谢谢你,这是一个非常有趣的观点,我将不得不考虑未来的发展(因为我目前正在做的只是一个勒索实验只是PHP清酒)。你能解释一下你所说的控制器是什么意思吗?回到我最初的问题,这两种方法的性能差异是什么?对不起,我还不能投票/控制器是triad中的
C
部分,基本上,它是一个从外部获取数据(用户输入、web请求等)并将其进一步转发到模型(=业务逻辑)和视图(=输出)的组件。至于性能,只要你在学习东西是如何工作的,就不要管它了,正确的结构和可读性要重要得多。如果你不介意的话,可以问一个快速的后续问题,在用户类中存储userUpdate方法可以吗?还是创建一个单独的类来接受用户对象并用它执行所有操作更好?为什么?@uFlock:设计问题没有明确的“最佳”答案,这要看情况而定。两种模式(vs)都有各自的用途,作为设计师,您有责任选择更适合您的用例。虽然这是一个很好的答案,但它让我更加困惑,因为我不知道数据网关对于简单CMS这样的小项目如何更有用。能否请您提供一个项目示例,其中实现数据网关的好处将超过与之相关的开发复杂性?