【问题标题】:Can I make a PHP function "private" in a script?我可以在脚本中将 PHP 函数设为“私有”吗?
【发布时间】:2019-12-20 06:45:26
【问题描述】:

我希望某些函数在 required 时不可见,但在它们所属的脚本中可见。
例如:

required.php:

<?php
function privateFunction() {
    echo 'from private function\n';
}
echo 'from required.php: ';
privateFunction();

index.php:

<?php
require './required.php';
echo 'from index.php: ';
privateFunction(); // I want this to give an error like "private function called outside the script it has been declared".

我已经尝试过创建函数private,但它只会给出解析错误。

【问题讨论】:

  • 为什么不使用 OOP?
  • 使用类并将函数设为私有。
  • @DevsiOdedra 我知道,但如果我这样做,将无法从“required.php”脚本访问该函数,并且我无法将类标记为“私有”,可以吗?
  • 您不能将普通函数设为私有。函数在设计上是全局的。您可以制作类似:$func = function () { ... }。然后您可以将其用作$func();。这样,您至少可以将其限制在写入的范围内,并且在完成后可以取消设置。
  • 如果您向我们解释为什么您需要这个以及它的用途,我们会更容易想出一个好的解决方案。现在,听起来有点像XY problem

标签: php


【解决方案1】:

required.php:

<?php
class A {
    private function privateFunction() {
        echo 'from private function\n';
    }
}

【讨论】:

  • 我不需要从类中访问该函数,而是从脚本中访问该函数。
【解决方案2】:

一般来说,这可能是一个坏主意(请参阅上面的 cmets),但以下应该可以满足您的要求。

它使用debug_backtrace() 来获取函数的文件名,然后是函数调用者的文件名,并进行比较。如果它们不匹配,则会引发异常:

function assertCalledByCurrentScript(): void
{
  $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
  if (isset($backtrace[1]) && $backtrace[0]['file'] !== $backtrace[1]['file']) {
    throw new \BadFunctionCallException("Cannot call {$backtrace[1]['function']} from outside of its defining script.");
  }
}

然后像这样使用它:

function privateFunction()
{
  assertCalledByCurrentScript();

  // rest of your "private" function here
}

【讨论】:

    【解决方案3】:

    基本上你唯一的选择就是在课堂上隐藏私人的东西:

    //Your file
    class MyClass
    {
      public static function myAction()
      {
        $internalStuff = self::internalStuff();
        return 'Using this function you can get what is inside internalStuff: ' . $internalStuff;
      }
    
      private static function internalStuff()
      {
         return 'Some internal stuff not accessible from outside';
      }
    }
    
    function myAction()
    {
        return MyClass::myAction();
    }
    
    //Otherfile
    //require yourfile.php
    
    //You can only use `myAction` as function
    echo myAction();
    
    //Or call
    echo MyClass::myAction();
    
    //But you cannot use `internalStuff
    echo MyClass::internalStuff();
    
    

    【讨论】:

      猜你喜欢
      • 2020-07-08
      • 2013-12-05
      • 2015-02-13
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 2020-08-07
      相关资源
      最近更新 更多