2009-02-06 34 views
12

Tôi có một biến trên phạm vi toàn cầu có tên là ${SYSTEM}, trong đó SYSTEM là hằng số được xác định. Tôi đã có rất nhiều lớp học với các chức năng cần phải có quyền truy cập vào biến này và tôi đang tìm kiếm nó gây phiền nhiễu tuyên bố global ${SYSTEM}; mỗi lần duy nhất.Tạo một biến toàn cục có thể truy cập được cho mọi hàm bên trong một lớp

Tôi đã thử khai báo biến lớp: public ${SYSTEM} = $GLOBALS[SYSTEM]; nhưng điều này dẫn đến lỗi cú pháp lạ vì tôi có lớp khác khai báo biến lớp theo cách này và có vẻ hoạt động tốt. Điều duy nhất tôi có thể nghĩ là hằng số không được công nhận.

Tôi đã quản lý để kéo điều này ra với một nhà xây dựng nhưng tôi đang tìm kiếm một giải pháp đơn giản hơn trước khi sử dụng đến đó.


EDIT Các $ toàn cầu {} HỆ THỐNG biến là một mảng với rất nhiều mảng con khác trong đó. Rất tiếc, dường như không có cách nào để sử dụng hàm tạo ...

Trả lời

1

Đặc tả trực tiếp của biến thành viên không được chứa bất kỳ tham chiếu nào đến các biến khác (class {public $membervar = $outsidevar;} không hợp lệ). Thay vào đó hãy sử dụng hàm tạo.

Tuy nhiên, khi bạn đang xử lý một hằng số, tại sao bạn không sử dụng các tiện ích constant hoặc class constant của php?

-2

tôi muốn nói hai điều đầu tiên mà đứng ra cho tôi là:

  1. Bạn không cần khung xung quanh tên biến, bạn chỉ có thể làm hệ thống public $ hoặc $ HỆ THỐNG công cộng.
  2. Mặc dù PHP có thể không phải lúc nào cũng yêu cầu nó là thực hành tiêu chuẩn để đóng gói các chỉ mục mảng không phải số trong dấu nháy đơn hoặc kép trong trường hợp chuỗi bạn đang sử dụng trở thành hằng số tại một số điểm.

này nên được những gì bạn đang tìm kiếm

class SomeClass { 
    public $system = $GLOBALS['system']; 
} 

Bạn cũng có thể sử dụng hằng số lớp mà thay vào đó sẽ

class SomeClass { 
    const SYSTEM = $GLOBALS['system']; 
} 

Điều này có thể được tham chiếu trong lớp với 'tự: : SYSTEM 'và bên ngoài với' SomeClass :: SYSTEM '.

+0

Điều đó có nghĩa các hằng số> tên biến? – atomicharri

+0

Trong câu hỏi, SYSTEM là một hằng số, không phải là một tên biến. – PolyThinker

+0

Tôi không biết bạn đang nói gì nhưng $ {SYSTEM} chắc chắn không giống với $ SYSTEM ... – atomicharri

-1

Bạn cũng có thể thử mẫu đơn, mặc dù ở một mức độ nào đó, nó được tán thành trong vòng kết nối OOP, nó thường được gọi là biến toàn cầu của các lớp.

<?php 
class Singleton { 

    // object instance 
    private static $instance; 

    // The protected construct prevents instantiating the class externally. The construct can be 
    // empty, or it can contain additional instructions... 
    protected function __construct() { 
    ... 
    } 

    // The clone and wakeup methods prevents external instantiation of copies of the Singleton class, 
    // thus eliminating the possibility of duplicate objects. The methods can be empty, or 
    // can contain additional code (most probably generating error messages in response 
    // to attempts to call). 
    public function __clone() { 
    trigger_error('Clone is not allowed.', E_USER_ERROR); 
    } 

    public function __wakeup() { 
    trigger_error('Deserializing is not allowed.', E_USER_ERROR); 
    } 

    //This method must be static, and must return an instance of the object if the object 
    //does not already exist. 
    public static function getInstance() { 
    if (!self::$instance instanceof self) { 
     self::$instance = new self; 
    } 
    return self::$instance; 
    } 

    //One or more public methods that grant access to the Singleton object, and its private 
    //methods and properties via accessor methods. 
    public function GetSystemVar() { 
    ... 
    } 
} 

//usage 
Singleton::getInstance()->GetSystemVar(); 

?> 

Ví dụ này được sửa đổi một chút từ wikipedia, nhưng bạn có thể lấy ý tưởng. Hãy thử googling Singleton pattern để biết thêm thông tin

+0

Tôi không thấy làm thế nào điều này có liên quan đến singleton. – PolyThinker

+0

Làm thế nào nó không liên quan? Một lời giải thích có vẻ thích hợp hơn. – Asciant

2

Bạn có thể sử dụng một constructor như thế này:

class Myclass { 
    public $classvar; 
    function Myclass() { 
    $this->classvar = $GLOBALS[SYSTEM]; 
    } 
} 

EDIT: Cảm ơn vì đã chỉ ra các lỗi đánh máy, Peter!

Điều này cũng phù hợp với mảng.Nếu assignment không mong muốn, lấy tài liệu tham khảo cũng làm việc:

$this->classvar =& $GLOBALS[SYSTEM]; 

EDIT2: Đoạn mã sau được sử dụng để thử nghiệm phương pháp này và nó làm việc trên hệ thống của tôi:

<?php 
define('MYCONST', 'varname'); 
$varname = array("This is varname", "and array?"); 

class Myclass { 
    public $classvar; 
    function Myclass() { 
    $this->classvar =& $GLOBALS[MYCONST]; 
    } 
    function printvar() { 
    echo $this->classvar[0]; 
    echo $this->classvar[1]; 
    } 
}; 

$myobj = new Myclass; 
$myobj->printvar(); 
?> 
+0

Nếu đó là '$ this-> classvar = ...'? –

1

Bạn đang cố gắng làm một cái gì đó thực sự ngoài tầm thường ở đây, vì vậy bạn có thể mong đợi nó sẽ khó xử. Làm việc với các hình cầu là không bao giờ dễ chịu, đặc biệt là không có lựa chọn tên động của bạn bằng cách sử dụng hằng số SYSTEM. Cá nhân tôi khuyên bạn nên sử dụng $GLOBALS[SYSTEM] ở mọi nơi thay thế, hoặc ...

$sys = $GLOBALS[SYSTEM]; 

... nếu bạn định sử dụng nó rất nhiều.

8

Ok, hy vọng tôi đã có những ý chính về những gì bạn đang cố gắng để đạt được

<?php 
    // the global array you want to access 
    $GLOBALS['uname'] = array('kernel-name' => 'Linux', 'kernel-release' => '2.6.27-11-generic', 'machine' => 'i686'); 

    // the defined constant used to reference the global var 
    define(_SYSTEM_, 'uname'); 

    class Foo { 

     // a method where you'd liked to access the global var 
     public function bar() { 
      print_r($this->{_SYSTEM_}); 
     } 

     // the magic happens here using php5 overloading 
     public function __get($d) { 
      return $GLOBALS[$d]; 
     } 

    } 

    $foo = new Foo; 
    $foo->bar(); 

?> 
8

này là làm thế nào tôi truy cập vào mọi thứ trên toàn cầu mà không toàn cầu.

class exampleGetInstance 
{ 

private static $instance; 

public $value1; 
public $value2; 


private function initialize() 
{ 
    $this->value1 = 'test value'; 
    $this->value2 = 'test value2'; 

} 

public function getInstance() 
{ 
    if (!isset(self::$instance)) 
    { 
     $class = __CLASS__; 
     self::$instance = new $class(); 
     self::$instance->initialize(); 
    } 
    return self::$instance; 
} 

} 

$myInstance = exampleGetInstance::getInstance(); 

echo $myInstance->value1; 

$myInstance bây giờ là một tham chiếu đến thể hiện của exampleGetInstance lớp.

Cố định định dạng

+0

Cảm ơn bạn! Nó đang làm việc tuyệt vời! – wormhit

-2
class Dateutility { 

    public $a,$b; 
    public function getCurrentTime() { 
     date_default_timezone_set("Asia/Karachi"); 
     echo "The current time is: "; 
     echo date("g:i a"); 
    } 

    public function seta($c) { 
     $a=$c; 
     echo "<br/>value of a is:".$a; 
    } 

    public function setb($d) { 
     $b=$d; 
     echo "value of b is:".$b; 
    } 

} 

$vari = new Dateutility;   
$vari->getCurrentTime(); 

$vari->seta(10); 
$vari->setb(20); 
+2

Điều này có liên quan như thế nào ở đây? – andho

Các vấn đề liên quan