OOP概念理解

时间:2012-02-28 04:11:52

标签: php oop

我最近开始在PHP中学习OOP的基础知识。

我是很多概念的新手。

在传统的程序化处理方式中,如果我有重复性的任务,我每次都会编写一个函数并调用它。

由于这似乎是一个常见的事件,我创建了一个包含5-10个函数的小型库,我将其包含在我的程序项目中并使用。

在OOP中,使用函数并从所有对象访问它们的有效方法是什么?

为了让事物更贴近现实世界,我创建了一个缩略图类,它将图像文件名作为参数,并可以对其执行某些操作。

在程序编程中。当我有一个创建缩略图的功能时,我还有一个函数来创建一个随机的md5字符串,检查一个给定的文件夹是否存在所述字符串,如果它存在则重复,所以我可以在保存之前为我的缩略图生成一个唯一的名称。

但如果我想为另一个目的生成另一个唯一名称,比如保存一个文本文件,我可以再次调用该函数。

所以,长话短说,从我的应用程序中的所有对象可以访问方法randomise_and_check($ filename)(以及我的库中的所有其他方法)的有效OOP方法是什么?

6 个答案:

答案 0 :(得分:4)

好问题。您要做的第一件事是确定您将使用的主要对象。一种简单的方法是识别与项目相关的所有名词。在你的例子中,听起来你将使用图像和字符串,从中我们可以创建两个包含相关属性(函数,成员变量等)的类。正如你明智地提到的,我们需要确保你可以从任何上下文中调用你转换成OOP的算法,所以我们尽可能地将它们抽象化(在合理范围内)。

因此,根据您的具体情况,我建议如下:

// Good object reference, abstract enough to cover any type of image
//  But specific enough to provide semantic API calls
class Image
{
    // Using your example, but to ensure you follow the DRY principle
    //  (Don't repeat yourself) this method should be broken up into two
    //  separate methods
    public static function randomise_and_check($fileUri)
    {
        // Your code here
        ....

        // Example of call to another class from within this class
        $hash = String::generateHash();
    }    
}

// Very abstract, but allows this class to grow over time, by adding more 
//  string related methods
class String
{
    public static function generateHash()
    {
        return md5(rand());
    }
}

// Calling code example
$imageStats = Image::radomise_and_check($fileUri);

还有其他一些方法和想法可以使用,例如是否实例化对象,或者我们是否应该创建一个我们可以扩展的父类,但这些概念随着时间的推移和实践将变得明显。我认为提供的代码片段可以让您清楚地知道如何从程序跳转到OOP。并且,与往常一样,不要忘记阅读docs以获取更多信息。

- 更新 -

添加OOP示例:

class Image
{
    protected $sourceUri;

    public function setSourceUri($sourceUri)
    {
        $this->sourceUri = $sourceUri;
    }

    public function generateThumb()
    {
        return YourGenerator::resize($this->getSourceUri);
    }
}

$image = new Image();

$image->setSourceUri($imageUri);

$thumbnail = $image->generateThumbnail();

答案 1 :(得分:3)

我看到它的方式,你有两个选择:

  • 不要担心将自己塞进OOP中,只需将它们包含在您想要使用它们的某些utilities.php文件中的标准全局函数中。这是我的首选方法。

  • 如果采用更多OOP方法,可以在某些实用程序类中创建static函数(“方法”)。从PHP文档:

    <?php
    class Foo {
        public static function aStaticMethod() {
            // ...
        }
    }
    
    Foo::aStaticMethod();
    $classname = 'Foo';
    $classname::aStaticMethod(); // As of PHP 5.3.0
    ?>
    

答案 2 :(得分:2)

使用静态函数创建一个(抽象)Util-class:

来自我的Util类的

示例:

abstract Class Util{

   public static function dump($object){
       echo '<pre class=\"dump\">' . print_r($object, true) . '</pre>';
   }

}

使用方法:

<?
$object = new Whatever();
//what's in the object?
Util::dump($object);
?>

答案 3 :(得分:2)

对于初学者来说,OOP开发与程序学并没有什么不同(一旦掌握了基本概念,它就会变得有点不同,但这对于学习基础知识并不重要。)

你一直在处理OO概念,你只是没有意识到这一点。当您单击文件管理器中的文件并操作该文件时......您正在使用面向对象的概念。该文件具有属性(大小,类型,只读等)以及您可以使用它执行的操作(打开,复制,删除)。

您只需将这些概念应用于开发,方法是创建具有属性的对象以及可以对其执行的操作(方法)。

在OOP世界中,您通常不会将其他内容提供给其他所有内容。 OOP是关于“封装”的,它只限制了对所需内容的访问。为什么要为橙汁对象提供“理发”方法?你不会。您只能将“理发”方法用于需要理发的对象。

答案 4 :(得分:2)

编写可重用的OO软件非常困难。即使是专业人士也无法在很多时候做到正确。在某些情况下,它需要经验,训练,练习以及坦率的运气。

您应该阅读有关依赖注入的内容,因为它似乎适用于您的特定问题。基本上,你有一个依赖于某种抽象的对象,也许是“图像库”功能。在您的控制器中,您将创建“图像库”对象的实例,并将该依赖项注入到其所需的任何其他对象中。

也就是说,你需要完全不再考虑全局范围。相反,你必须以理智的方式划分功能并将它们联系在一起。基本上,对象应该只知道他们需要知道的东西(也查找Demeter法和SOLID)。我重申,这很难做到正确,而且大多数时候你仍然可以使应用程序运行得很漂亮,即使它做错了。

如果你想对此非常严格,你应该将这一思路应用于所有事情,但是如果你有一个包含像return isset($_POST[$key]) ? $_POST[$key] : $default;之类的非常简单的函数,我认为创建一个全局函数没有真正的危害那。您可以创建一个HttpPost包装器类,但在大多数情况下,这都是过度的。(

答案 5 :(得分:1)

简答:使用普通功能。 OOP鼓励您考虑数据和相关例程,使用静态函数而不是普通函数不会使您的程序更加面向对象。单一编程范式之后是不切实际的,当你看到这会使你的程序更清洁时,将它们结合起来。