PHP:使用彼此函数的类?
我已经研究这个问题有一段时间了,在这里问了一些问题。我有一些建议,但我就是不明白。有没有人能给我举一个班级合作顺利的例子 我有3门课(可能更多):PHP:使用彼此函数的类?,php,class,dependency-injection,Php,Class,Dependency Injection,我已经研究这个问题有一段时间了,在这里问了一些问题。我有一些建议,但我就是不明白。有没有人能给我举一个班级合作顺利的例子 我有3门课(可能更多): mysql 使用者 警报 正如我所说的,有人可以提供一个例子,让这些类可以使用其他类的函数,例如,用户可以使用mysql的函数。我要一个简单的例子,用于学习目的 请不要用谷歌的建议或其他问题的链接。我已经试着搜索了一段时间了。但是没有成功 玛蒂·莱恩(Martti Laine)当你说“合作顺利”时,很难准确理解你的意思。类可以以多种方式一起使用。
- mysql
- 使用者
- 警报
玛蒂·莱恩(Martti Laine)当你说“合作顺利”时,很难准确理解你的意思。类可以以多种方式一起使用。如果不能,那么面向对象编程就不会有多好 下面是一个简单的例子:
class mysql {
private $alert;
public function __construct(alerts $alert) {
$this->alert = $alert;
}
public function dosomething() {
if(/* something went wrong */ ) {
$this->alert->showAlert();
}
}
}
有两种方法可以做到这一点 1:使用静态方法
<?php
class mysql_database
{
public static function query($q)
{
return mysql_query($q);
}
}
class user
{
public function get()
{
//calling static method from another class
return mysql_database::query("SELECT * FROM users");
}
}
?>
<?php
class mysql_database
{
public function query($q)
{
return mysql_query($q);
}
}
class user
{
public function get($DB)
{
//calling method using given instance
return $DB->query("SELECT * FROM users");
}
}
$DB = new mysql_database();
$user = new user();
$user->get($DB);
?>
2:将对象实例作为参数提供给其他对象方法
<?php
class mysql_database
{
public static function query($q)
{
return mysql_query($q);
}
}
class user
{
public function get()
{
//calling static method from another class
return mysql_database::query("SELECT * FROM users");
}
}
?>
<?php
class mysql_database
{
public function query($q)
{
return mysql_query($q);
}
}
class user
{
public function get($DB)
{
//calling method using given instance
return $DB->query("SELECT * FROM users");
}
}
$DB = new mysql_database();
$user = new user();
$user->get($DB);
?>
我真的建议您首先阅读有关类的内容,因为如果您不理解单个代码示例,这些都是基本概念,对您没有多大帮助
class Mysql {
// Public function accessible from everywhere, with class instance
public function hello() {
echo '<br>Mysql says Hello';
}
// Static function accesible from everywhere, without class instance
static function bye() {
echo '<br>Mysql says Bye';
}
}
class User {
// Public function accessible from everywhere, with class instance
public function hello() {
$mysql = new Mysql();
$mysql->hello();
Mysql::bye();
}
}
class Alert {
// Static function accesible from everywhere, without class instance
static function hello() {
$user = new User();
$user->hello();
}
}
$user = new User();
$user->hello();
Mysql::bye();
Alert::hello();
classmysql{
//通过类实例,可以从任何地方访问公共函数
公共函数hello(){
echo'
Mysql说你好';
}
//静态函数可从任何地方访问,无需类实例
静态函数bye(){
echo'
Mysql说再见';
}
}
类用户{
//通过类实例,可以从任何地方访问公共函数
公共函数hello(){
$mysql=newmysql();
$mysql->hello();
Mysql::bye();
}
}
类警报{
//静态函数可从任何地方访问,无需类实例
静态函数hello(){
$user=新用户();
$user->hello();
}
}
$user=新用户();
$user->hello();
Mysql::bye();
警报::你好();
您可以顺利地:
- 从一个类实例化另一个类中的对象
- 将一个对象实例传递到另一个实例:这称为依赖项注入
- 使用静态函数调用
它们的使用取决于应用程序的整体设计、使用、重构和可测试性需求等。类应该协同工作以实现预期的结果。如果您正在寻找特定的依赖项注入或其他方法,大多数OOP文献都会对此进行解释 但是,如果您的Mysql类公开了许多将由您的用户类使用的函数,那么您可以在实例化时将Mysql类的实例注入到您的用户类中:
class User {
private $db = null;
public function __construct($mysql) {
$this->db = $mysql
}
public function getUserName($userID){
$sql = "SQL_QUERY";
$result = $this->db->ExecuteQuery($sql);
}
}
请确保您阅读了依赖项注入的缺点,并理解为什么此方法优于其他方法。如果您希望将Mysql类更改为DBClass,并且不破坏现有代码,那么您必须实现相同的方法。当然,这可能会变得更“复杂”,因此可能需要仔细设计(您的类可能必须扩展抽象类或实现接口)
我建议你花些时间在文献上,研究一些模式来获得一个整体的想法。这就足够让你开始了(我认为这是一个很好的起点)下面是另一个例子
class MySql
{
private function query($q)
{
return mysql_query($q);
}
public function checkCredentials($user, $pass)
{
$query = "" // add code here to check the user credentials
$result = query($query);
$outcome = <true/false>;//based on however you analyze your result
return $outcome;
}
}
class alert
{
public function generateAlert($alert)
{
//code to display your alert
}
}
class user
{
var $mysql;
var $alert;
public function __construct($mysql, $alert)
{
$this->mysql = $mysql;
$this->alert = $alert;
}
public function checkLogin($user, $pass)
{
if (!$this->mysql->checkCredentials($user, $pass))
$this->alert->generateAlert("login failed!");
}
}
classmysql
{
私有函数查询($q)
{
返回mysql\u查询($q);
}
公共函数检查凭据($user,$pass)
{
$query=”“//在此处添加代码以检查用户凭据
$result=query($query);
$output=;//基于您分析结果的方式
返回$结果;
}
}
类警报
{
公共函数generateAlert($alert)
{
//显示警报的代码
}
}
类用户
{
var$mysql;
var$alert;
公共函数构造($mysql,$alert)
{
$this->mysql=$mysql;
$this->alert=$alert;
}
公共函数checkLogin($user,$pass)
{
如果(!$this->mysql->checkCredentials($user,$pass))
$this->alert->generateAlert(“登录失败!”);
}
}
有很多方法可以进行面向对象的设计,这实际上取决于项目的需求。我还建议访问PHP站点并查看他们的OOP教程。我建议您在上阅读OOP基础知识,编写一些代码,并在遇到问题时将这些代码与问题一起发布。有几十种方法可以回答这个问题,但没有一种是“正确”的答案。作为OOP领域的新手,我完全理解你想要的答案。似乎很多例子都太复杂了,当你只想看到日常使用中几个类之间的简单交互时,就开始使用抽象类和接口。谢谢,事实上我对类有些了解,但不太了解:D回答不错:)