Php 普通函数可以模拟OOP吗?

Php 普通函数可以模拟OOP吗?,php,functional-programming,Php,Functional Programming,OOP编程可以用普通函数来模拟吗?与使用静态变量和匿名函数类似:静态变量用于编写过程代码,乍一看就像OOP OOP是一种设计模式,它与您使用的语言的哪个方面无关。阅读以下文章将使您受益匪浅:。它解释了如何编写面向对象的代码(即使只有函数) 另外,您应该意识到这是一种完全不同的开发范式。有一些函数式语言是为这个范例设计的:JavaScript、Scala、Haskell、Erlang。我想我能想象的最接近的方法就是编写所有函数,将它们的第一个参数作为要操作的数据结构。你可以这样想: OOP本质上只

OOP编程可以用普通函数来模拟吗?与使用静态变量和匿名函数类似:

静态变量用于编写过程代码,乍一看就像OOP

OOP是一种设计模式,它与您使用的语言的哪个方面无关。阅读以下文章将使您受益匪浅:。它解释了如何编写面向对象的代码(即使只有函数)


另外,您应该意识到这是一种完全不同的开发范式。有一些函数式语言是为这个范例设计的:JavaScript、Scala、Haskell、Erlang。

我想我能想象的最接近的方法就是编写所有函数,将它们的第一个参数作为要操作的数据结构。你可以这样想:

OOP本质上只是将已知的数据结构与适当的行为耦合起来

因此,如果您愿意相信自己只传递函数知道如何使用的数据结构,您可以按程序对其进行建模,每个“类”在全局空间中有两个数组,一个用于“实例”,一个用于“函数”(字面上是一个可调用数组,键入其名称)

我编写了一些代码,将“类”定义为一组方法,这些方法可以按照自己的意愿处理
$self
(只要它们都知道会发生什么)。这是一个很酷的主意(谢谢你的邀请!)。请注意匿名函数的使用,从理论上讲,匿名函数可以聚合为一个函数原型数组,并在许多不同的类上使用(即,只有一个“description”或“u_toString”类,适用于所有类)

编辑:工作代码:
是。例如,在函数语言中重载函数在某种程度上等同于OOP中的继承。但关键是,您甚至不应该考虑让用函数式语言编写的代码看起来像OOP。将它们视为不同的工具,以实现相同的目标

OOP在理论上促进了一个更干净的代码库,并允许更容易地重用代码。 当它出现时,围绕这些概念有很多炒作,许多人甚至会说今天它是过度炒作。函数式语言在过去的几年里重新获得了应有的尊重,许多人已经意识到OOP只是一个流行词,绝不是代码质量的保证

函数式编程有许多编码技术和方法,可以使它像面向对象编程一样优雅。在工作中使用正确的工具对于任何项目来说都是一个良好的开端,正确地使用它是你应该集中注意力的主要部分。试图让一个特定项目的代码库看起来像是带有函数式语言的OOP,这不会带来任何好处,而且必然会让某个人感到痛苦:如果不是你,就是必须维护它的人

您的主要目标之一是拥有一个尽可能容易理解的代码库,函数式编程有很多特定的方法来处理这个问题,就像OOP中有很多方法一样。在我看来,函数式编程甚至有一个优势,因为它更灵活

我曾见过并管理过相当大的项目,在其中工作是一种乐趣。还有一些小的OOP项目,让你很难理解。即使使用正确的工具,在错误的手中也会带来糟糕的结果


我的2分钱,快乐编码

很多人对OOP到底是什么有不同的看法。。。 我认为OOP是一种以非常具体的方式设计程序的方法,使用对象作为程序或计算的系统隐喻,这有助于您将生成的过程和软件融入到许多非常好、有用和强大的品质中

考虑到这一点,您可以在使用任何语言时应用OOP方法,在某些语言中使用OOP比在其他语言中使用OOP容易得多。。。在“OOP”语言中,它通常是最简单的,这些语言不是强迫您编写OOP代码的语言(因为这是不可能的),但它为您提供了一组功能,如果您想遵循OOP方法,将使您的生活更轻松


最后,要“充分模拟OOP”,最困难的“事情”是能够使用“行为”或“代码”作为数据。。。这可以通过很多方式实现,比如lambda函数、一级函数、函数指针等等。。。大多数现代语言至少支持其中一种。

面向对象编程是指拥有一个构造函数来启动一个对象,其他函数可以使用
this
关键字“静态”访问该对象

因此,是的,您可以在不使用诸如“class”、“this”或_构造之类的语言构造的情况下进行OOP

正常OOP

class Something{
    public $member_var;

    public function __construct(){
        $this->member_var="x";
    }

    public function fill($strValue){
        $this->member_var=$strValue;
    }
}
$objInstance=new Something();

$objInstance->fill("abc");
使用过程语言构造的OOP(我已经避免使用对象类来避开任何OOP内容,但是最好将其用于$self类型,也许能够使用->访问器,或者利用自动按引用传递):

使用PHP>=5.3新的匿名函数特性,您可以将成员函数作为属性添加到$self数组/对象中,因为您可以直接调用(
$self[“fill”](“abcde”)
)。如果为$self使用对象数据类型,则可以获得更好的访问

根据您设计代码的方式,可以调整此过程式OOP,使其在简单的RPC场景中正常工作(但是,构造函数永远不会返回可用的$self对象/数组,因此您最好使用完整的OOP并遇到同样的问题)

如果使用(object)array()路径,您可以将fill函数作为属性存储在对象中,但是您永远不会有
$this
引用(不将其作为参数传递)、原型或任何其他类型的继承。你最好在PHP中使用class关键字,没有理由绕开它

如果y
class Something{
    public $member_var;

    public function __construct(){
        $this->member_var="x";
    }

    public function fill($strValue){
        $this->member_var=$strValue;
    }
}
$objInstance=new Something();

$objInstance->fill("abc");
function Something_constructor(&$self){
    $self=array(
        "member_var"=>"x",
    );
}

function fill(&$self, $strValue){
    $self["member_var"]=$strValue;
}

Something_constructor($arrInstance);

fill($arrInstance, "abc");
func Point(x, y) {
  var my_x = x
  var my_y = y
  var this = {
    getX : func() { return my_x }
    getY : func() { return my_y }
    move : func(dx, dy) { my_x += dx; my_y += dy }
    dist : func() { return sqrt(this.getX()**2 + this.getY()**2) }
  }
  return this
}

var p = Point(0, 3)
p.move(2, -5)
p.getY()  // -2