【问题标题】:In PHP classes is it possible to create a private variable inside of a function?在 PHP 类中是否可以在函数内部创建私有变量?
【发布时间】:2017-09-10 23:59:36
【问题描述】:

在使用 PHP 类时,我注意到在类内部,当我以 $this->variablename 的方式将函数中的变量定义为该类的属性时,它会自动成为该类的公共变量。

class example {
    public function setstring() {
        $this->string = "string";
    }
}

这样

$class = new example();
echo $class->string; 

输出:string

但是,如果我想创建只能由类内的函数访问的私有变量,是否只能在 setstring() 函数内声明它们?而不是像这样在函数之外将它们声明为私有。

class example {
    private $string ='';
    public function setstring() {
        $this->string = "string";
    }
}

有人这样做的原因是为了整洁,以免在类开始时声明一长串私有变量。

【问题讨论】:

  • 也许使用私有数组来存储变量和值?
  • 你所说的“整洁”我称之为模棱两可。在大多数情况下,所有属性都应该在类的顶部声明,尤其是私有属性。这样您就知道该对象应具有哪些属性。要回答您的问题,不,所有动态声明的属性默认情况下都是公共的。

标签: php function class scope


【解决方案1】:

,没有办法做到这一点。

在 PHP 中,您通常使用自记录 cmets 按字母顺序在函数上方声明 all 您的类/实例属性。这是编写类的最“整洁”和清晰的方式。还建议您完全避免使用公共属性,根据需要使用 getter 和 setter。

PHP 的规范编码风格在PSR-1PSR-2 中定义。我还建议您查看PHPDoc

请记住,在您的类方法范围内声明的变量将是该方法的私有变量。如果您打算从其他方法访问它,则只需要一个类属性。

<?php
class Example {

  /**
   * Holds a private string
   * @var string
   */
  private $string = '';

  /**
   * Sets the private string variable
   */
  public function setString() {
    $this->string = 'This string is accessible by other methods';
    $privateVar = 'This string is only accessible from within this method';
  }

}

【讨论】:

    【解决方案2】:

    如何使用 OOP 在 PHP 类中创建私有变量 (面向对象编程)。

    在 PHP 类中声明私有变量的最佳方法是在 __Construction 方法上方创建它们,按照惯例,您可以在美元符号后使用下划线开始变量(即 $_private_variable),以让其他程序员阅读您的代码一看就知道是私有变量,brilliant

    请声明你在一个类中的所有变量都是私有的,除了总是公开的 __getter 和 __setter,除非你有理由不这样做。

    使用 __setter (__set) 函数为类中的私有变量设置值,当需要该值时,使用 __getter (__get) 函数返回值。

    为了理解它,让我们创建一个非常小的类,可用于创建不同类型的车辆,这将使您了解如何正确创建私有变量、为其设置值并从中返回值,准备好了吗?

        <?php
    
        Class Vehicle{
    
            /* Delcaration of private variables */
    
            private $_name = "Default Vehicle";
            private $_model;
            private $_type;
            private $_identification;
    
            /* Declaration of private arrays */
            private $_mode = array();
            private $feature = array();
    
            /* Magic code entry function, think of it as a main() in C/C++ */
            public function __construct( $name, $model, $type ){
                $this->create_vehicle( $name, $model, $type );
            }
    
            /* __getter function */
            public function __get( $variable ){
                if( !empty($this->$variable) ){
                    $get_variable = $this->$variable;
                }
    
                return $get_variable;
            }
    
            /* __setter function */
            public function __set( $variable, $target ){
                $this->$variable = $target;
            }
    
            /* Private function */
            private function create_vehicle( $name, $model, $type ){
                $this->__set( "_name", $name );
                $this->__set( "_model", $model);
                $this->__set( "_type", $type );
            }
    
        }
    
        //end of the class.
    
    ?>
    
    <?php
        /* Using the Vehicle class to create a vehicle by passing
           three parameters 'vehicle name', 'vehicle model', 'vehicle type' 
           to the class.
        */
    
        $toyota = new Vehicle("Toyotal 101", "TY101", "Sedan");
    
        /* Get the name and store it in a variable for later use */
        $vehicle_name = $toyota->__get('_name');
    
        /* Set the vehicle mode or status */
        $vehicle_mode = array(
                'gas' => 50,
                'ignition' => 'OFF',
                'tire' => "OK",
                'year' => 2020,
                'mfg' => 'Toyoda',
                'condition' => 'New'
            );
    
        /* Create vehicle features */    
        $vehicle_feature = array(
                "Tire" => 4,
                "Horse Power" => "V6",
                "blah blah" => "foo",
                "Airbag" => 2,
                "Transmission" => "Automatic"
                //....
            );
    
        /* Create vehicle identification */
        $vehicle_identification = array(
            "VIN" => "0001234567ABCD89",
            "NAME" => $vehicle_name,
            "FEATURE" => $vehicle_feature,
            "MODEL" => $vehicle_mode,
            "YEAR" => 2020,
            "MFG" => "Totota"
        ); 
    
    
        /* Set vehicle identification */
        $toyota->__set("_identification", $vehicle_identification );
    
        /* Set vehicle features */
        $toyota->__set("_feature", $vehicle_feature );
    
        /* Set vehicle mode */
        $toyota->__set("_mode", $vehicle_mode);
    
        /* Retrieve information and store them in variable using __get (getter) */
        $vehicle_name = $toyota->__get('_name');
        $vehicle_mode = $toyota->__get('_mode');
        $vehicle_id =  $toyota->__get('_identification');
        $vehicle_features = $toyota->__get('_feature');
        $vehicle_type = $toyota->__get('_type');
        $vehicle_model = $toyota->__get('_model');
    
    
        /* Printing information using store values in the variables. */
        echo "Printing Vehicle Information\n";
        echo "*****************************\n";
    
        echo "Vehicle name is $vehicle_name \n";
        echo "Vehicle Model is $vehicle_model \n";
        echo "Vehich type is $vehicle_type \n";
    
        printf("\n\n");
        echo "Printing Vehicle Mode\n";
        echo "***********************\n";
        print_r( $vehicle_mode );
    
        printf("\n\n");
        echo "Printing Vehicle Features\n";
        echo "**************************\n";
        print_r( $vehicle_features );
    
        printf("\n\n");
    
        echo "Printing Vehicle Identification\n";
        echo "******************************\n";
        print_r( $vehicle_id );
    
    
        printf("\n\n");
    ?>
    

    这段代码的输出:

    Printing Vehicle Information
    *****************************
    Vehicle name is Toyotal 101 
    Vehicle Model is TY101 
    Vehich type is Sedan 
    
    
    Printing Vehicle Mode
    ***********************
    Array
    (
        [gas] => 50
        [ignition] => OFF
        [tire] => OK
        [year] => 2020
        [mfg] => Toyoda
        [condition] => New
    )
    
    
    Printing Vehicle Features
    **************************
    Array
    (
        [Tire] => 4
        [Horse Power] => V6
        [blah blah] => foo
        [Airbag] => 2
        [Transmission] => Automatic
    )
    
    
    Printing Vehicle Identification
    ******************************
    Array
    (
        [VIN] => 0001234567ABCD89
        [NAME] => Toyotal 101
        [FEATURE] => Array
            (
                [Tire] => 4
                [Horse Power] => V6
                [blah blah] => foo
                [Airbag] => 2
                [Transmission] => Automatic
            )
    
        [MODEL] => Array
            (
                [gas] => 50
                [ignition] => OFF
                [tire] => OK
                [year] => 2020
                [mfg] => Toyoda
                [condition] => New
            )
    
        [YEAR] => 2020
        [MFG] => Totota
    )
    

    要使用此代码进行实时测试或试验,请参阅demo,更改名称,随意创建新车辆。

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      不可能作为语言功能,但有一个非常简单有效的技巧:

      class Test
      {
          /**
           * Hidden dynamic data.
           * @var object
           */
          private $_ = (object)[];
      
          public function setString()
          {
              $this->_->string = "string";
          }
      }
      

      您可以将$_ 更改为您想要的任何内容,但它对我来说确实看起来更老套。 $this-&gt;this 也是一个选项。

      【讨论】:

        猜你喜欢
        • 2017-12-05
        • 2010-10-03
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 2014-01-02
        • 2013-09-07
        • 1970-01-01
        • 2017-03-22
        相关资源
        最近更新 更多