【问题标题】:PHP encapsulation without class?没有类的PHP封装?
【发布时间】:2011-10-23 17:17:14
【问题描述】:

是否可以在 PHP 中封装一个变量或函数而不将它们包装在一个类中?我正在做的是:

//Include the file containing the class which contains the variable or function
include('SomePage.php');

//Instantiate the class from "SomePage.php"
$NewObject = new SomeClassFromSomePage();

//Use the function or variable
echo $NewObject->SomeFuncFromSomeClass();
echo $NewObject->SomeVarFromSomeClass;

我的目的是避免命名冲突。这个例程虽然有效,但让我感到疲倦。如果我不能不上课,可以不实例化一个类吗?并立即使用变量或函数?

【问题讨论】:

  • 您可能希望为此使用工厂方法(或伴随过程)。如果变量的创建依赖于之前的方法调用,那么你还需要流畅的链接。
  • @domanokz 你能描述一下“避免命名冲突”是什么意思吗?
  • @Phil 我可能在主页和包含的页面中有相同的$x

标签: php encapsulation


【解决方案1】:

要在不实例化的情况下使用类方法和变量,它们必须声明为static

class My_Class
{ 
    public static $var = 123;

    public static function getVar() {
     return self::var;
    }
}


// Call as:
My_Class::getVar();

// or access the variable directly:
My_Class::$var;

使用 PHP 5.3,您还可以使用namespaces

namespace YourNamespace;

function yourFunction() {
  // do something...
}


// While in the same namespace, call as 
yourFunction();

// From a different namespace, call as
YourNamespace\yourFunction();

【讨论】:

  • 在这种情况下如何使用$var?或$getVar?
  • @domanokz 查看我添加的内容,可能是在您输入评论时
  • 谢谢,但是双冒号对我来说是新的,我必须使用::而不是->吗?
  • @domanokz 静态方法和属性使用双冒号范围运算符访问,而实例化类的方法和属性使用->访问
【解决方案2】:

PHP Namespaces 被用于归档完全相同的目标:

<?php // foo.php
namespace Foo;
function bar() {}
class baz {
    static $qux;
}
?>

当使用这样的调用命名空间函数时:

<?php //bar.php
include 'foo.php';
Foo\bar();
Foo\baz::$qux = 1;
?>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
相关资源
最近更新 更多