Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从另一个类访问类变量_Php_Oop - Fatal编程技术网

Php 从另一个类访问类变量

Php 从另一个类访问类变量,php,oop,Php,Oop,我对PHP OO概念比较陌生。我一直在搞下面的事情 <?php require('class_database.php'); require('class_session.php'); class something { $database = NULL; $session = NULL; function __construct() { $this->database = new database(); $this->session =

我对PHP OO概念比较陌生。我一直在搞下面的事情

<?php

require('class_database.php');
require('class_session.php');

class something {  

  $database = NULL;
  $session = NULL;

  function __construct() {
    $this->database = new database();
    $this->session = new session();
  }

  function login() {
    $this->session->doLogin();
  }
}
?>

in another script

$something = new something();
$something->login();

在另一个脚本中
$something=新事物();
$something->login();
在本例中,
$database
有一个构造函数,它创建一个包含MySQLi连接的受保护变量。它还有一个名为
query()
的函数

如果运行
$database->query
需要
$session
,我该如何操作?创建一个新的数据库类会非常浪费,但我似乎无法从
$session
访问
$database

我是否为自己制造了一个本该避免的大麻烦?我希望会话提供登录验证,这将需要访问数据库来检查凭据

感谢您的帮助,有关此主题的更多信息,请参见和

<?php
class something {  
  require('class_database.php');
  require('class_session.php');

  $database = new database();
  // dependency injection either here in constructor or in the function that needs it below
  $session = new session($database);


  $session->doSomething(); //This method wants to access $database->query();
}
?>

更新(OP更改了相关代码)


有关此主题的更多信息,请参阅和

<?php
class something {  
  require('class_database.php');
  require('class_session.php');

  $database = new database();
  // dependency injection either here in constructor or in the function that needs it below
  $session = new session($database);


  $session->doSomething(); //This method wants to access $database->query();
}
?>

更新(OP更改了相关代码)


让会话类的构造函数接受一个作为数据库实例的参数怎么样

$database = new database();
$session = new session($database);
然后在会话构造函数中,将其设置为对象的属性并使用它:

private var $_database;

public function __construct($database) {
   $this->_database = $database;
}

public function doSomething() {
    $this->_database->query();
}

让会话类的构造函数接受一个作为数据库实例的参数怎么样

$database = new database();
$session = new session($database);
然后在会话构造函数中,将其设置为对象的属性并使用它:

private var $_database;

public function __construct($database) {
   $this->_database = $database;
}

public function doSomething() {
    $this->_database->query();
}

你发布的代码毫无意义–你确定你不是有意将其全部放在
某物的构造函数中吗?不能在类中的函数体之外生成命令语句;只有声明。哦,你说得对。我试图简化我原来的问题,但这不太管用。我会编辑它。你发布的代码没有意义-你确定你不是想把它全部放在
某物的构造函数中吗?不能在类中的函数体之外生成命令语句;只有声明。哦,你说得对。我试图简化我原来的问题,但这不太管用。我会编辑的。嗨,看起来这是票!我将$database公开,并将其作为会话的引用传递。工作得很有魅力。干杯@Lokicat:FWIW,这是另一个答案中提到的依赖注入的一个例子。这是OOP中一个重要的设计原则,您应该熟悉它!我用其他语言做过,但在PHP中我发现了一个奇怪的地方。一提到这一点,焰火就燃起了,一切都有了意义:)作为旁白,你可能想调用类
数据库
会话
,因为在PHP中大写类名是很常见的。嗨,看起来这就是问题所在!我将$database公开,并将其作为会话的引用传递。工作得很有魅力。干杯@Lokicat:FWIW,这是另一个答案中提到的依赖注入的一个例子。这是OOP中一个重要的设计原则,您应该熟悉它!我用其他语言做过,但在PHP中我发现了一个奇怪的地方。一提到这一点,焰火就燃起了,一切都有了意义:)作为旁白,您可能想调用类
数据库
会话
,因为在PHP中大写类名是很常见的。您正在将
$Session
传递到
某物
的构造函数中,但您没有对它做任何操作?我希望构造函数中有
$this->session=$session
…您正在将
$session
传递到
某物的构造函数中,但您却什么都没做?我希望构造函数中的
$this->session=$session
。。。