到目前为止,我觉得我已经理解了OOP编程的概念和优点,而且我对理解如何使用PHP中的类没有任何困难.
然而,这让我有点困惑.我想我可能会理解,但我仍然不确定.
我一直在关注一组视频教程(不确定链接到外部资源的规则,但我在youtube上找到它们),并且它们非常自我解释.除了令人沮丧的是,当导师决定将一个类作为参数传递给另一个类时.至少我认为这是正在发生的事情;
Class Game
{
public function __construct()
{
echo 'Game Started.<br />';
}
public function createPlayer($name)
{
$this->player= New Player($this, $name);
}
}
Class Player
{
private $_name;
public function __construct(Game $g, $name)
{
$this->_name = $name;
echo "Player {$this->_name} was created.<br />";
}
}
Run Code Online (Sandbox Code Playgroud)
然后我实例化Game类的一个对象并调用它的方法;
$game = new Game();
$game-> createPlayer('new player');
Run Code Online (Sandbox Code Playgroud)
相当令人沮丧的是,导师并没有真正解释他为什么这样做,并且在我看来,并没有显示代码中任何可以证明这一点的调用.
Player中的魔术方法构造函数是否在Game类中作为引用传递?这是否意味着可以通过引用在Player类中访问整个类?在引用$ this而不指向任何特定方法或属性时,是否引用了整个类?
如果这是正在发生的事情,那么我为什么要这样做呢?如果我在我的游戏类中创建了一个播放器,那么我肯定可以在游戏类中访问我的播放器属性和方法,对吧?为什么我还要在我的Player类中使用我的Game Class?例如,我可以在Player类中调用createPlayer()吗?
如果我的解释一直令人困惑,我道歉.
我想我的问题归结为; 什么是我作为参数准确传递,为什么我想在每天OOP编程中做到这一点?
我有一个PHP脚本,它通过我自己的自定义函数运行一个值数组,该函数使用PHP函数preg_match.它正在寻找与我的正则表达式为$ valueA的匹配,并且我要搜索的字符串为$ valueB,如果找到匹配,则将其返回到$ match,否则我不希望我的IF语句运行.
现在,如果函数找到匹配(换句话说,为TRUE),我运行这个IF语句没问题;
if ($match = match_this($valueA, $valueB))
{
//do this
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我想比较一个额外的条件来检查它是否也是TRUE,并且只在两个都为TRUE时运行IF语句,我会遇到问题;
if ($match = match_this($valueA, $valueB) && $x == 'x')
{
//do this
}
Run Code Online (Sandbox Code Playgroud)
当两个条件都为TRUE时,我最终输出1来自$ match而不是我的$ match值,而不是正常运行.
我可以看看发生了什么.我的IF语句只是将一个文字布尔值TRUE返回到$ match,而不是我从match_this()返回的值;
这是因为我只能回归一种真实感吗?
我可以通过使用两个嵌套的IF语句来解决这个问题,但为了清晰的代码,我希望能够比较我的IF中包含返回值的函数的多个条件.
是否有不同种类的真实?如果是这样,我如何以这种方式比较它们?或者有更简单的方法吗?我想我可以在我的函数中放入第二个IF语句并通过函数传递我的第二个条件,但是我的函数在其目的方面不会非常明确地定义.
我之前遇到过这个问题,并不太清楚我在寻找什么.希望有人能提供帮助.
我需要编写一个脚本来搜索CSV文件,并在其上执行某些搜索功能;
现在,我在程序上编码时没有任何问题,但是当我现在转向面向对象编程时,我想使用对象的类和实例.
但是,在OOP中思考并不是我自然而然的,所以我不完全确定要走哪条路.我不是在寻找具体的代码,而是寻找如何设计脚本的建议.
我目前的想法是这样的;
它如何在index.php中起作用:
我用这种方法看到的问题是这个;
我应该这样做吗?
我的主要问题是看起来我可能需要多个搜索对象并在我的循环类中迭代这个.
任何帮助将非常感激.我对OOP很新,虽然我了解各个部分,但我还没有看到更大的图景.我可能会过度复杂化我正在尝试做的事情,或者可能有一种更简单的方式我还看不到.
我真的一直在为此绞尽脑汁,因为对于我的一生,我无法弄清楚问题出在哪里。
我有一些要在其上运行正则表达式的数据。作为参考,原始文档使用iso-8859-15进行编码(如果有区别的话)。
这是一个使用正则表达式的函数;
if(preg_match("{£\d+\.\d+}", $handle)) //
{
echo 'Found a match';
}
else
{
echo 'No match found';
}
Run Code Online (Sandbox Code Playgroud)
无论我尝试什么,我似乎都无法匹配它。我已经尝试过搜索£符号。我已经检查了正则表达式,并且没有任何问题。我什至将源数据直接粘贴到正则表达式测试器中,它可以找到与我要查找的内容完全匹配的内容。我只是不明白为什么我的正则表达式不起作用。我已经查看了要搜索的字符串中的原始数据,并且£符号清晰可见。
我感觉到那里有些编码字符我看不到,但是无论我如何输出数据,我只能看到£符号,但是无论出于何种原因都无法识别它。
有任何想法吗?是否存在查看字符串中原始数据的绝对方法?我尝试了var_dump和var_export,但是我确实感觉有些不对劲,因为var_export确实以另一种语言显示数据。如何查看变量中的“真正”内容?
我什至将内容保存到txt文件中。英镑在那里。应该没有理由不能使用正则表达式找到它。我就是不明白。如果我创建一个字符串并粘贴到我的正则表达式中,那么它会找到匹配的字符串而不会出现任何问题。
真是莫名其妙。
我环顾四周,我无法弄清楚我哪里出错了,因为我在使用接口时似乎遵循了正确的约定,但也许我忽略了一些东西。我得到的确切错误是:
对 Icommand 的 vtable 的未定义引用
我刚刚开始将我的类和类声明分离到单独的头文件中,所以也许我在某处缺少预处理器指令。
主.cpp:
#include <iostream>
#include <string>
#include <cstdlib>
#include "Icommand.h"
#include "Command.h"
using namespace std;
void pause();
int main(){
Icommand *run = new Command("TEST");
cout << run->getCommand() << endl;
delete run;
pause();
}
void pause(){
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
cin.get();
}
Run Code Online (Sandbox Code Playgroud)
命令.h:
#ifndef ICOMMAND_H
#define ICOMMAND_H
#include <string>
#include <vector>
class Icommand
{
private:
public:
Icommand(){}
virtual ~Icommand(){}
virtual bool run(std::string object1) = 0;
virtual bool run(std::string object1, std::string object2) = 0;
virtual std::string getCommand() const; …Run Code Online (Sandbox Code Playgroud) 我正在关注一些C++教程,令人沮丧的是,源材料声明无法进行这个特定的函数调用,但根本没有解释原因;
template<typename T>
void Swap(T &a, T &b){
T temp;
temp = a;
a = b;
b = temp;
}
Run Code Online (Sandbox Code Playgroud)
所以,现在我创建一个明确的模板函数实例化和传递a和b;
int a = 5;
double b = 10.3;
Swap<double>(a, b);
Run Code Online (Sandbox Code Playgroud)
然后抛出以下编译器错误;
无法将'a'(类型'int')转换为'double&'类型
我唯一的预感是,这是因为规则表明rvalue不能绑定到非const引用,但是,如果T &a只是一个别名,它本身不是rvalue,是吗?我的隐式转换是创建一个临时的,它无法绑定到T &a?那是怎么回事?
temp是一个左值.它可能只有函数范围,但确实存在.那么为什么它不允许隐式转换加倍,然后将引用分配给temp?意图看起来很清楚.我不太明白参考作为参数.如果a被分配给temp,这是一个左值,那么这是不是允许的?
那是假设我在这里正走在正确的轨道上.
编辑:
第二个例子;
int a = 5;
double &d = a; // invalid initialization of reference of type 'double&' from expression of type 'int'
Run Code Online (Sandbox Code Playgroud)
然而;
int a = 5;
const …Run Code Online (Sandbox Code Playgroud) php ×4
c++ ×2
oop ×2
casting ×1
csv ×1
function ×1
if-statement ×1
inheritance ×1
interface ×1
loops ×1
methods ×1
object ×1
polymorphism ×1
regex ×1
statements ×1
templates ×1