我一直在努力掌握OOP概念,虽然我确实掌握了大多数概念,但我经常发现自己需要一些关于实际实施的建议.其中一种情况是工厂方法.
我正在编写一个PHP应用程序,它将处理从Web和命令行界面传入的请求,因此我提出了以下简单的类继承结构来涵盖这两种类型的请求:
abstract class Request {
}
class HttpRequest extends Request {
}
class CliRequest extends Request {
}
Run Code Online (Sandbox Code Playgroud)
现在我需要一个工厂方法,它将返回一个具体的Request实例,具体取决于返回的值php_sapi_name():
public function create() {
if(php_sapi_name() === 'cli')
return new CliRequest();
else
return new HttpRequest();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我在哪里放?我至少可以想到三种可能性:
1)单独类中的静态方法:
class RequestFactory {
public static function create() {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
2)单独类中的常规方法(需要首先实例化该类):
class RequestFactory {
public function create() {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
3)抽象父类中的静态方法:
abstract class Request {
public static function create() {
// ...
}
} …Run Code Online (Sandbox Code Playgroud) 在PHP中使用Curl,在下载正文之前,有什么方法可以检查HTTP响应标头吗?假设我向某个URI发出GET请求,并且仅当Content-typeis 时才想获取内容text/html。我知道我可以先发出HEAD请求,然后再决定是否使用GET,但是仅在一个请求中有可能吗?
我基本上是在寻找等效的以下C#代码:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://some.uri");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if(response.ContentType.Equals("text/html")) {
string body = new StreamReader(response.GetResponseStream()).ReadToEnd();
} else {
// do nothing
}
Run Code Online (Sandbox Code Playgroud)
可能吗?