PHP中的私有方法和变量用法

6 浏览
0 Comments

PHP中的私有方法和变量用法

此问题已经有答案了:

public、private和protected之间有什么区别?

我一直在考虑php中使用private变量和方法的用途。

我不想谈论汽车之类的事情。我想谈论一个自己的脚本。

使用public或private对程序员和脚本所有者有何区别。

如果脚本是一个计算器,而我是将来唯一维护代码的人。我什么时候需要使用private变量或方法?这会如何改变脚本呢?

另外,如果是涉及变量的改动?如果有人试图更改值,但由于私有的原因不能这样做。他会直接使用setter来改变变量吗?

我需要一个好的例子,以便我能看到private方法或变量对程序员或最终用户有好处。

我在编写一些脚本时,有人告诉我不要在类中使用var。我问他为什么?他说你必须使用public或private..并问为什么?

如果有一种直接更改变量的方法,为什么还要使用setter呢?

如果有一种直接更改变量的方法,为什么还要使用getter呢?

admin 更改状态以发布 2023年5月21日
0
0 Comments

对于最终用户来说,他们看不到代码,因此在这里没有(不)优势。

对于程序员来说,将不需要在对象外部使用的东西声明为private只是良好的编程实践和保护机制。从技术上讲,如果你是一个完美的程序员,并且不关心代码的外观,使用private不会给你带来任何好处。然而,私有成员实施黑匣子模型 - 你只关心对象做了什么,而不关心它是如何工作的(从外部观察)。最终,如果出于任何原因你(或其他人)需要/想要使用你的代码,他们会知道什么方法和属性要使用/调用,以获得对象具有的功能,而不会修改对象需要维护的内部值。这可能会给你带来一些优势 - 这只是代码外观的问题。这就是好的编程实践所在,它们通常被遵循,因为经验表明它们往往可以最大程度地减少错误。

至于var,它已被弃用。这意味着它可能会在将来被删除。

0
0 Comments

首先,在开发强大的面向对象类时,应该尽可能少地暴露类内部的语义(显然不能影响功能)。\n一些变量只有在类的上下文中才有价值,对于使用类的开发人员来说是没有意义的。将变量设为公共的,任何使用这个类的人都可以随心所欲地修改它,尽管他们可能不知道它的用途。在PHP中,当你甚至没有类型安全来至少缓解可能造成的损失时,这可能是一个特别大的问题。\n考虑这个场景:你有一个类,包装了一些I/O操作。让我们称之为“文件读取器”。\n

class FileReader {
    public $_handle;
    public function __construct($filepath) {
        $this->_handle = fopen($filepath, 'r');
        if ($this->_handle === NULL) {
            throw new Exception("Unable to open the file for reading");
        }
    }
    // ... the rest of the class
}

\n现在你可以看到这个类打开了一个文件句柄。通过将`$_handle`变量设为公共的,你已经将它暴露给所有使用你的类的人员了。他们不需要知道你打开的原始文件句柄,他们只想要使用你的好类来执行一些读取操作。但是,它是公共的;他们不仅可以看到它,还可以修改它。这很糟糕,特别是当你的其他代码假定`$_handle`变量是有效的时。\n

$reader = new FileReader();
$reader->_handle = "I hope this doesn't break anything. /trololol";
$reader->someOperation(); // oh no! Our file handle has just been changed to something completely wrong, this is now going to the break the class.

\n这种荒谬的情况可以通过一开始将变量设置为私有来完全避免。关于每个访问修饰符的作用以及何时应用它们的更多(更好的)例子,请参见这个答案。\n现在,讨论一下getter和setter。在你的问题中,你似乎假定所有的getter和setter都是按照以下方式编写的:\n

class Foo {
    private $_bar;
    public function getBar() {
        return $this->_bar;
    }
    public function setBar($newBar) {
        $this->_bar = $newBar
    }
}

\n在这种情况下,你是完全正确的,在第一次将`$_bar`变量设为公共的时没有任何区别。\n但是,getter和setter方法使你控制外部开发人员如何设置你的变量,这样你就可以立即检测到他们是否会犯大错,并避免后来的未定义行为。例如:\n

class Foo {
    private $_bar;
    public function getBar() {
        return $this->_bar;
    }
    public function setBar($newBar) {
        // Now we're going to ensure that $newBar is always an integer
        if (!is_int($newBar)) {
            // not an integer, throw out an exception to let the developer know that somewhere is setting invalid input
            throw new Exception("Expected an integer value for 'Bar'");
        }
        $this->_bar = $newBar;
    }
}

\n这不仅使你的类更加健壮,同时也使使用你的类的开发人员的工作更容易。他们不必担心在类试图使用`$_bar`的破损值时,难以调试一个极其奇怪的问题,他们可以轻松地从堆栈跟踪中了解这个损坏的值是从哪里设置的,并在源代码中进行修复。\n有大量关于变量访问和getter/setter方法的文档,它适用于各种语言,因此不要害怕查找基于C++/C#/VB.NET的文章,它们都大致翻译成相同的材料。

0