在另一个类中更改/设置受保护的属性 - PHP

时间:2017-04-30 18:12:26

标签: php

服务器PHP版本为5.3.0

我正在使用David Powers的一系列教程'书,PHP解决方案,第三版。它们处理文件上传(在本例中为图像)和图像上传时的缩略图创建。

这需要使用三个类:

Upload.php - 处理文件上传

Thumbnail.php - 这会创建图片缩略图

ThumbnailUpload.php - 这会延长Upload.php并需要Thumbnail.php。当上传主图像时,它与其他两个类一起用于创建缩略图图像。它还添加了在创建缩略图后保留或删除原始图像的选项,以及为生成的缩略图文件名添加后缀的选项(我现在使用的这些功能都没有,但我可以在其他地方使用它们)申请稍后)。

如下面的代码所示,ThumbnailUpload.php扩展了Upload.php,并且还需要Thumbnail.php类。由于ThumbnailUpload.phpupload_page.php页面中调用的内容,因此Thumbnail.php似乎不在循环中,因为我努力更改$maxSize受保护的属性它失败了。经过充分测试后,很明显Thumbnail.php没有获得新值。

我已阅读有关反思的内容,也许这是允许我访问$maxSize中的Thumbnail.php属性的方法,但文档对于像我这样的新手来说没有足够的意义。

我希望能够为传递给$maxSize的{​​{1}}获取新值,而根本不知道如何。

相关代码:upload_page.php

Thumbnail.php

注1: 这会设置受保护的属性' $ max'在Upload.php中,以便可以根据需要更改以字节为单位的最大文件大小

注2: 这是为了更改受保护的属性' $ maxSize'在Thumbnail.php中,除了这会抛出一个php错误,说明在ThumbnailUpload.php中这个公共函数是未定义的,因为它实际上在Thumbnail.php中。所以我将公共函数添加到ThumbnailUpload.php并且错误消失但Thumbnail.php中的$ maxSize保持不变

相关代码:ThumbnailUpload.php

// max file size for images
$max = 1048576;

// max long side dimension in pixels
$maxSize = 150;

// upload pics and create thumbnails
require_once('ClassFiles/Image/ThumbnailUpload.php');
$loader = new ThumbnailUpload('../images/projects/project_1/');
$loader->setThumbDestination('../images/projects/project_1/gallery_1/thumbnails/');
$loader->setMaxSize($max); // see note 1 below
$loader->setThumbSize($maxSize); // see note 2 below
$loader->upload();
$errors = $loader->getMessages();
$names = $loader->getFilenames();

相关代码:Thumbnail.php

namespace ClassFiles\Image;

use ClassFiles\File\Upload;

require_once __DIR__ . '/../File/Upload.php';
require_once 'Thumbnail.php';

class ThumbnailUpload extends Upload {

protected $thumbDestination;
protected $deleteOriginal;
protected $suffix = '_thb?'; // omit special characters to switch this on

public function setThumbSize($thumbSize) {
    if (is_numeric($thumbSize) && $thumbSize > 0) {
        $this->maxSize = (int) $thumbSize;
    }
}

1 个答案:

答案 0 :(得分:0)

不确定,如果我的问题正确......

<?php

class Thumbnail {

    protected $maxSize = 100;

    public function setMaxSize($size) {
        $this->maxSize = $size;
    }
}

class Upload {

}

class ThumbnailUpload extends Upload {

    protected $thumbnail;

    public function __construct(Thumbnail $thumbnail) {
        $this->thumbnail = $thumbnail;
    }

    public function upload() {
        // not possible, as maxSize is only accessible from Thumbnail an
        // all of it's child classes
        $this->thumbnail->maxSize = 200;

        // that works, as setMaxSize is public
        $this->thumbnail->setMaxSize(200);
    }
}

如果setMaxSize也受到保护,则无法从ThumbnailUpload更改setMaxSize。在这种情况下,类作者不希望任何人都可以更改此值。如果您是作者,则可以更改class Thumbnail { public function __construct($maxSize = 100) { $this->maxSize = $maxSize } } 的可见性或向Thumbnail添加新的构造函数参数

num