Php 是否有理由为单个函数创建类?
我见过很多类都有一个函数。为什么他们把一个函数放在类中 我使用类只是为了让事情更清楚,但是关于那些将单个函数放入类中的人?有什么原因吗 我看不出这两者之间有什么区别:Php 是否有理由为单个函数创建类?,php,class,function,Php,Class,Function,我见过很多类都有一个函数。为什么他们把一个函数放在类中 我使用类只是为了让事情更清楚,但是关于那些将单个函数放入类中的人?有什么原因吗 我看不出这两者之间有什么区别: <?php class Image { private $resource; function resize($width, $height) { $resized = imagecreatetruecolor($width, $height); imagecopyresamp
<?php
class Image {
private $resource;
function resize($width, $height) {
$resized = imagecreatetruecolor($width, $height);
imagecopyresampled($resized, $this->resource, 0, 0, 0, 0, $width, $height, imagesx($this->resource), imagesy($this->resource));
$this->resource = $resized;
}
}
$image = new Image();
$image->resource = "./someimage.jpg";
$image->resize(320, 240);
我认为$resource是主要原因,因为它是私有的:
class Image {
private $resource;
function resize($width, $height) {
$resized = imagecreatetruecolor($width, $height);
imagecopyresampled($resized, $this->resource, 0, 0, 0, 0, $width, $height, imagesx($this->resource), imagesy($this->resource));
$this->resource = $resized;
}
}
$image->resize(320, 240);
因此无法访问全局范围。但是为什么在这种情况下不使用简单的函数呢?类不仅仅是“函数容器”,它们在那里代表一个对象,一个实体。它们应该用适用于给定实体的方法封装该实体所需的数据
有时可能有一个对象类只需要为其定义一个方法,但它只属于该对象类。与其将类视为函数的集合,不如考虑类的角色。类通常应该知道它包含什么,而不知道它不包含什么,并且应该只捕获一个键抽象。在某些情况下,这是有意义的 我主要做嵌入式编程,很少使用类。但单个函数类可能用于-
- 后来继承的
- 强制类专用的数据结构的完整性(封装)
- 可用于保持代码的同质性
- 为什么有些函数中只有一行代码?因为这是所有需要的。现在,您可以调用该函数,而不是到处重复一行代码。如果那行代码需要调整,它只需要在一个地方发生。这是在利用过程封装
你的简短课程也是如此。您现在可以利用类所能做的一切,特别是继承和多态性,比如说
SVGImage extensed Image
和覆盖方法resize
实现必要的功能不需要最少的行数。我认为对任何东西进行“分类”的最好理由,即使是像您拥有的小功能,也只是为了可伸缩性。也许接下来你会想在这个函数中添加额外的功能,让它能够破译图像格式或你拥有的东西。将其封装到类中将是实现简单可伸缩性的方法。另外,控制函数和变量的范围始终是一个好主意,而将它们保持在全局范围内通常不是一个好主意。这是一个很好的做法,因为当您看似很小的项目突然变成一个大项目时,可能会造成麻烦。首先,在您的函数中,您不能将此函数用于任何其他图像文件。这可以通过一个额外的参数来修正,所以我将跳过这一个 第二,您可以扩展该类,并添加更多的方法,所有这些方法都会影响设置的图像资源 第三,您可以将类自动加载程序与类一起使用,因此仅在实际使用该类时加载包含该类的文件,而不是在每次脚本运行时加载该类,或者担心在何处放置include和require语句 第四,也可能是最重要的一点,您可以使用这个类和任何其他类作为另一个类的输入,允许您通过选择要插入的类来更改该类的功能。例如
class ImageProcessingClass {
protected $imageResource;
protected $processors = array();
public function setImageResource($image_resource) {
$this->imageResource = $image_resource;
}
public function addProcessor(Processor $processor) {
$this->processors[] = $processor;
}
public function processImage() {
foreach ($this->processors as $processor) {
$this->imageResource = $processor->process($this->imageResource);
}
}
}
interface Processor {
public function process($image);
}
class ProcessorResize implements Processor {
public function process($image) {
// resize image code here...
return $image;
}
}
class ProcessorFilter implements Processor {
public function process($image) {
// filter image code here...
return $image;
}
}
以及使用这个的代码
$image_processor = new ImageProcessor();
$image_processor->setImageResource($image_resource);
$image_processor->addProcessor(new ProcessorResize());
$image_processor->addProcessor(new ProcessorFilter());
$image_resource = $image_processor->processImage();
此模式允许您以多种不同的组合添加处理器类,并以影响图像的方式产生不同的结果。通过类的组合具有许多不同可能性的可重用代码。除了上面给出的关于为什么要将单个方法包装到类中的一些重要原因之外,还有一个原因: 在C++中,如果你想为一个方法提供一个接口,你必须定义一个调用。p> e、 g 每个希望提供自己的回调实现的客户机都需要扩展到此类
Java为可以“实现”的接口提供了直接表示法 类就像对象的集合,一个实体。类使用适用于该实体的方法封装给定实体所需的数据,并且对象具有一些属性(属性)和方法(函数),这些属性和方法定义到其类类型中 通常,方法用于更改属性值。因此,每个函数都需要类
它的存在。根据php中的现代开发,使用类非常灵活或健壮 全局公开所有函数并不是一个好主意。 所以,为了避免这种情况,我们可以在类中使用静态函数并用类名调用它 例如: 2011年答案 这实际上是一个很好的问题,我在这里看到了一些很好的答案。事实上,我真的需要考虑一下 我想补充一些我在这里的其他答案中没有看到的东西,即使我没有得到任何投票,这样未来的读者可以受益 让我们举个例子。(我对它们进行了编辑,使它们在功能上完全相同——它们与上面的略有不同。) 课程版本:
<?php
class Image {
private $resource;
function resize($width, $height) {
$resized = imagecreatetruecolor($width, $height);
imagecopyresampled($resized, $this->resource, 0, 0, 0, 0, $width, $height, imagesx($this->resource), imagesy($this->resource));
$this->resource = $resized;
}
}
$image = new Image();
$image->resource = "./someimage.jpg";
$image->resize(320, 240);
在实践中,它们在功能上是相同的。主要区别在于OOP范式与过程范式;在OOP中,您在类(称为方法)中定义作用于成员变量的函数,而在过程程序中,您将该变量传递给在全局范围中定义的函数
那么,既然函数仍然做同样的事情,那么在类中包装函数而不是使其全局化有什么好处呢
您希望在PHP(以及我能想到的许多其他语言)中这样做的主要原因是作用域@头针提及
class CallBackClient
{
public:
// A callback function.
virtual s32 callback( int param1, int param2 ) = 0;
};
Class A{
public static function xyz(){
//function handling
}
}
A::xyz();
<?php
class Image {
private $resource;
function resize($width, $height) {
$resized = imagecreatetruecolor($width, $height);
imagecopyresampled($resized, $this->resource, 0, 0, 0, 0, $width, $height, imagesx($this->resource), imagesy($this->resource));
$this->resource = $resized;
}
}
$image = new Image();
$image->resource = "./someimage.jpg";
$image->resize(320, 240);
function resize($width, $height, $resource) {
$resized = imagecreatetruecolor($width, $height);
imagecopyresampled($resized, $resource, 0, 0, 0, 0, $width, $height, imagesx($resource), imagesy($resource));
$resource = $resized;
return $resource;
}
resize(320, 240, "./someimage.jpg");