我有一个核心类作为收集器,两个子类存储在这个核心类的公共变量中:
class Core
{
public $cache;
public $html;
public function __construct()
{
$cache = new Cache();
$html = new Html();
}
}
class Cache
{
public function __construct()
{
}
public function store($value)
{
// do something
}
}
class Html
{
public $foo;
public function __construct()
{
$foo = "bar";
global $core;
$core->cache->store($foo);
}
}
问题: 我想摆脱“全球$ core”这一行并做类似的事情: $这 - >父 - >&的cache GT;存储($ foo的) $ cache应该以某种方式连接到$ core,因为它是$ core的公共成员
我知道$ html是一个存储为变量而不是继承的子类。 有什么想法吗?
第二个问题:我可以忽略Cache-Class中的空构造函数吗?
答案 0 :(得分:1)
你可以做的是使用依赖注入的概念在你的HTML类中注入一个Cache类的对象,然后用它来调用方法存储。我相信这是一个非常好的方法。所以你可以这样做。
// ---------------------------------------------------------------------------------------------------
function testConvert() {
var file = {
id: "1cpAZp...I7ejZW1idk", // Google Sheet
folderId: "0B_...Z1k", // test folder
}
convert(file, "pdf", "application/pdf");
convert(file, "csv", "text/csv");
convert(file, "xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}
// ---------------------------------------------------------------------------------------------------
function convert(file, extension, targetMimeType) {
var exportDetails = {
targetMimeType: targetMimeType || "application/pdf",
extension: extension || "pdf",
postfix: "CONVERTED_FROM_GOOGLE_DOC",
}
// http://stackoverflow.com/questions/42887569/using-google-apps-script-how-to-convert-export-a-drive-file
// https://code.google.com/p/google-apps-script-issues/issues/detail?id=6573
// var blob = Drive.Files.export(file.id, exportDetails.targetMimeType, {alt: "media"})
/*
results in error 200 + content of converted file
documentation https://developers.google.com/drive/v2/reference/files/export
1) does not mention the {alt:"media"} (and without it the error is: "export requires alt=media to download the exported content")
2) states the output is a Files resource (not a blob)
*/
// using alternative: OAuth2 + public API
// https://github.com/googlesamples/apps-script-oauth2
var driveService = getDriveService();
if (!driveService.hasAccess()) {
showSidebar();
return;
}
var accessToken = driveService.getAccessToken();
var url = "https://www.googleapis.com/drive/v2/files/"+file.id+"/export?mimeType="+ exportDetails.targetMimeType
var blob = UrlFetchApp.fetch(url, {
headers: {
Authorization: 'Bearer ' + driveService.getAccessToken()
}
});
var resource = {
title: DriveApp.getFileById(file.id).getName() +" "+ exportDetails.postfix +"."+ exportDetails.extension,
description: "This is a converted document",
mimeType: exportDetails.targetMimeType,
parents: [{
"kind": "drive#parentReference",
"id": file.folderId,
//"selfLink": string,
//"parentLink": string,
"isRoot": false
}],
}
try {
var convertedFile = Drive.Files.insert(resource, blob);
Logger.log('ID: %s, File size (bytes): %s', convertedFile.id, convertedFile.fileSize);
} catch(e) {
Logger.log(e)
}
}
在您的课程HTML:
class Core
{
public $cache;
public $html;
public function __construct()
{
$cache = new Cache();
$html = new Html($cache);
}
}
关于你的第二个问题,如果没有必要在构造函数中做某事,你可以省略它。但是也没有问题让它空着。所以我认为这取决于你。
答案 1 :(得分:0)
您的对象无法访问调用者类方法,因为他对调用者没有任何了解。
您可以尝试在创建新对象时传递父对象
class Core {
public $cache;
public $html;
public function __construct() {
$this->cache = new Cache($this);
$this->html = new Html($this);
}
}
class Html {
public $parent;
public function __construct($parent) {
$this->parent = $parent;
if (!empty($this->parent->cache)) {
$this->parent->cache->store();
}
}
}
我可以省略空构造函数 - 是的,您甚至根本不需要声明__construct
方法,因为所有类都有默认的构造函数/析构函数。